設答案為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任意兩個相鄰的字元都不相同。第二行,乙個字...