牛客小白月賽7 J方格填色 狀態壓縮 矩陣加速

2021-10-22 06:25:09 字數 1246 閱讀 5646

有乙個m * n的矩陣,如果左右兩格不能同為白色,左右兩列不能同為黑色,問有多少染色的方法

因為m只有5,而n有1e18因此肯定是用到狀態壓縮的,很容易我們可以選出相鄰兩列中可行的狀態轉移規律,只要兩列不同為0 or 與運算後為0,這樣都是符合要求的狀態,接下來就是用兩列來寫出遞推的公式。

可以構造出乙個矩陣來優化線性的計算,我們將所有的狀態看成點,這個矩陣其實就是一張圖,如果是1,代表i可以到j。接下來就用矩陣自乘來代表列之間的轉移,例如i到j的方案數其實就是i到k1,k1到j的方案數+i到k2,k2到j的方案數+…其實就是模擬矩陣乘法的過程

最後先初始化答案矩陣,因為第一列的所有狀態都是滿足要求的,所以答案矩陣第一列全都置為1

#include

using

namespace std;

#define fi first

#define se second

#define re register

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

1e6+

10, m =

1e6+

5, inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

int tot;

struct matrix

}mp;

matrix ksm

(matrix &a, ll k)

return ans;

}void

solve()

} base =

ksm(base, n-1)

; matrix ans;

for(

int i =

0; i < tot; i++

) ans.a[0]

[i]=1;

ll res =0;

ans = ans * base;

for(

int i =

0; i < tot; i++

) res =

(res + ans.a[0]

[i])

% mod;

cout << res << endl;

}signed

main()

牛客小白月賽12 392J

月月和華華一起去吃飯了。期間華華有事出去了一會兒,沒有帶手機。月月出於人類最單純的好奇心,開啟了華華的手機。哇,她看到了一片的qq推薦好友,似乎華華還沒有瀏覽過。月月頓時醋意大發,出於對好朋友的關心,為了避免華華浪費太多時間和其他聊天,她要刪掉一些推薦好友。但是為了不讓華華發現,產生猜疑,破壞了他們...

牛客小白月賽2 J 美 構造

最後,s l selina 開始了選美大賽。一如既往地,s l 想最大化自己的愉悅度。她品味十分獨特,對 美 有自己獨到的見解。她給每位經過層層選拔來到這一關的參賽男友都定義了乙個帥氣值 s l 需要將這些參賽者排成一排,她對於這個排列的 美 值的定義是 其中表示排列中第 個人的帥氣值。特別地,當 ...

牛客 牛客小白月賽6 J 洋灰三角

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 洋灰是一種建築材料,常用來築橋搭建高層建築,又稱,水泥 混凝土。whz有很多鑄造成三角形的洋灰塊,他想把這些洋灰三角按照一定的規律放到擺成一排的n個格仔裡...