JZOJ5278 神奇的車票

2021-08-21 04:05:52 字數 2128 閱讀 1024

設答案為f(n,m)

先排除平移相同,那麼需要使外輪廓四邊上都有點,最後再將比它小矩形f(n』,m』)(n』

對於乙個置換群g(

a1..

.ak)

g (a

1...

ak),令c1

(ai)

c 1(

ai)表示經過置換ai

a

i後不動點的個數,那麼等價類個數為∑c

1(ai

)k∑ c1

(ai)

k通俗來講,給定k種操作,對於乙個狀態通過ai操作不變的有ci個,那麼不同狀態(a狀態不能通過操作獲得b稱a,b不同)的個數為∑c

ik∑ ci

k那麼可以將變換弄成這幾種

不動 橫向翻摺

縱向翻摺

橫向再縱向翻摺

正方形的話還要多出4種

順逆時旋轉

順逆時旋轉再橫向翻摺

可以保證情況沒有重複

至於保證四周都有邊,可以對(1,1)(1,m)(n,1)(n,m)是否打孔進行討論,接著再討論中間的情形

直接貼**了

#include

#include

#define n 1000

#define ny4 250000002

#define ny8 125000001

#define mo 1000000007

#define max(a,b) ((a)>(b)?(a):(b))

using

namespace

std;

long

long f[1001][1001],p[1001001];

void inc(long

long &a,long

long b)

void init()

if(j==1)inc(f[i][j],p[max(i-2,0)]);else

if(j==1)inc(f[i][j],p[i-1>>1]);else

if(j==1)inc(f[i][j],p[i-1>>1]);else

f[i][j]=(f[i][j]*ny4)%mo;

}f[i][i]=(f[i][i]*4)%mo;

if(i==1)inc(f[i][i],2);else

if(i==1)inc(f[i][i],2);else

f[i][i]=(f[i][i]*ny8)%mo;

}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)inc(f[i][j],f[i][j-1]);

for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)inc(f[i][j],f[i-1][j]);

for(int i=1;i<=n;i++)for(int j=1;jint main()

return

0;}

Nowcodercontest5278H 紙牌遊戲

可以合理地想到從高到低依次列舉每一位的數,然後 text 一下後面是否存在方案,問題在於如何快速check 設還還剩下的 mod 3 0,1,2 的數個數分別為 c 0.2 設總共還需要 n 個,需要湊出 mod 3 t 的方案 這時後我們假設列舉某乙個,比如我們列舉 0 選了 i 個,設還剩下 n...

Nowcodercontest5278G血壓遊戲

做法非常多。比如對於同一層的點直接建立虛樹,然後模擬dp即可 如果不想建虛樹,可以直接維護合併,每次合併得到的 text 一定是同層點按照dfs序排序之後相鄰兩點的 text 之一 處理出所有這樣的lca,然後按照dep從大到小依次操作 用乙個set維護,每次取出子樹區間裡的點合併上來即可。不知道 ...

JZOJ 交換 模擬

給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...