洛谷P1357 花園

2022-08-03 02:06:11 字數 1166 閱讀 4169

給定乙個環形的01序列,保證任意相鄰的m個值中有不超過k個1,求滿足要求的方案數對1e9+7取模的值

狀壓dp+矩陣快速冪

由於m的範圍很小,所以我們考慮狀壓dp儲存狀態,而由於n很大,所以我們考慮矩陣快速冪優化轉移

我們定義$f(i,j)$表示前i個數最後m個的狀態為j時的方案數,顯然這個dp的初始是所有合法的$f(m,j)$

考慮這個dp的終點,顯然是$f(n+m,j)$,別忘了這是乙個環形。

那麼我們通過矩陣優化轉移,定義矩陣x[i][j]表示i狀態能否轉移到j狀態,那麼轉移我們只需要將這個矩陣自乘n次即可

關於初始狀態,我們可以通過dfs列舉合法的狀態即可。

最終的答案就是x[i][i]

時間複雜度為$o((2^m)^3log_2n)$

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4

const

int mod = 1e9 + 7;5

ll n, m, k;

6int maxx, id[7];7

struct

matrix

10 matrix operator *(const matrix &x) const

18} a, b;

19int vis[1000

];20

void make(int s, int

num)

25void dfs(int x, int now, int

s) 30 dfs(x + 1

, now, s);

31if (now < k) dfs(x + 1, now + 1, s | id[x - 1

]);32}33

intmain()

45 ll ans = 0;46

for (register int i = 0; i <= maxx; ++i)

47if (vis[i]) ans = (ans + a.m[i][i]) %mod;

48 printf("

%lld\n

", ans);

49return0;

50 }

ac code

狀壓dp 矩陣 洛谷 P1357 花園

簡單來說,這一題就是乙個狀壓dp用矩陣優化 但是這個矩陣也是最最最基礎的矩陣了 floyd矩陣 dp的話,和第乙個題解hi一樣的 f i s 表示第i位時的方案,s為i i m 1的狀態 然後轉移的時候我們列舉i列舉2個s if v j k f i j f i j f i 1 k mo 這裡的v j...

洛谷P1357 花園(狀態壓縮 矩陣快速冪)

小l有一座環形花園,沿花園的順時針方向,他把各個花圃編號為1 n 2 n 10 15 他的環形花園每天都會換乙個新花樣,但他的花園都不外乎乙個規則,任意相鄰m 2 m 5,m n 個花圃中有不超過k 1 k例如,n 10,m 5,k 3。則 ccpcppppcc 是一種不符合規則的花圃 ccpppp...

洛谷 1357 花園

的運算優先順序低於 貌似對矩陣理解更深刻了!2 m 5,相鄰的m個花圃可能有2 m種狀態 用0 2 m 1來表示 要求有不超過k個c形花圃,對應其二進位制形式中的0不超過k個。標記出0 2 m 1中滿足條件的狀態x,對於每個狀態x,前m個花圃會出現1次 f i,x 表示前i個花圃中,最後m個花圃的狀...