有乙個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個格仔裡...