結果
問題 | No.621 3 x N グリッド上のドミノの置き方の数 |
ユーザー |
![]() |
提出日時 | 2017-12-21 12:19:28 |
言語 | cLay (20241019-1) |
結果 |
AC
|
実行時間 | 66 ms / 3,000 ms |
コード長 | 895 bytes |
コンパイル時間 | 3,533 ms |
コンパイル使用メモリ | 181,048 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-05 12:50:05 |
合計ジャッジ時間 | 8,116 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 66 |
ソースコード
struct M {mint a[64][64];void zero(){a[0...63][0..63]=0;}void unit(){zero();a[0..63][0..63]=1;}mint* operator[](int y){return a[y];}};M operator*(M&a,M&b){M c;rep(y,64){rep(x,64){c[y][x]=0;rep(z,64){c[y][x]+=a[z][x]*b[y][z];}}}return c;}bool ok(int k){return k&3 && k&6 && k&030 && k&060 && k&011 && k&022 && k&044;}void dbg_p(M&a){rep(y,64){wt(y/8*10+y%8,": ",a.a[y](64),ok(y)?"*":"");}}{ll n;M a,e;a.zero();rep(i,64){rep(j1,8){int j=j1*9;if((i<<3&j)==0){int k=i<<3|j;if(ok(k/8)){a[k&077][i]+=1;}}}}rep(i,64){rep(j,64){if((j&3)==0){a[j|3][i]+=a[j][i];}if((j&6)==0){a[j|6][i]+=a[j][i];}}}rd(n);e.unit();while(n){if(n&1){e=e*a;}a=a*a;n>>=1;}mint c=0;rep(k,64){if(ok(k)){c+=e[k][63];}}wt(c);}