結果
問題 | No.541 3 x N グリッド上のサイクルの個数 |
ユーザー |
![]() |
提出日時 | 2017-06-30 23:42:36 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,000 ms |
コード長 | 1,784 bytes |
コンパイル時間 | 1,600 ms |
コンパイル使用メモリ | 166,544 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-04 21:46:33 |
合計ジャッジ時間 | 2,749 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 62 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define int long longint MOD=1000000007LL; //<- alert!!!typedef vector<int> arr;typedef vector<arr> mat;inline arr mul(mat a,arr& b,int mod){arr res(b.size(),0);for(int i=0;i<(int)b.size();i++)for(int j=0;j<(int)a[i].size();j++)(res[i]+=a[i][j]*b[j])%=mod;return res;}inline mat mul(mat& a,mat& b,int mod){mat res(a.size(),arr(b[0].size(),0));for(int i=0;i<(int)a.size();i++)for(int j=0;j<(int)b[0].size();j++)for(int k=0;k<(int)b.size();k++)(res[i][j]+=a[i][k]*b[k][j])%=mod;return res;}mat base;inline mat mat_pow(mat a,int n,int mod){if(base.empty()){base=mat(a);for(int i=0;i<(int)a.size();i++)for(int j=0;j<(int)a[i].size();j++)base[i][j]=(i==j);}mat res(base);while(n){if(n&1) res=mul(a,res,mod);a=mul(a,a,mod);n>>=1;}return res;}void s(arr &a,int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9){a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;a[8]=a8;a[9]=a9;}signed main(){int n;cin>>n;arr a(10,0);a[8]=1;mat m(10,arr(10,0));s(m[0],1,0,0,0,0,0,0,0,0,0);s(m[1],1,1,0,1,0,0,0,1,0,1);s(m[2],1,0,1,1,0,0,1,1,0,0);s(m[3],1,1,1,1,0,0,1,1,0,0);s(m[4],1,0,0,0,1,0,1,1,0,1);s(m[5],1,1,0,0,1,1,0,0,0,0);s(m[6],1,0,1,1,1,0,1,1,0,0);s(m[7],1,1,1,1,1,1,1,1,0,0);s(m[8],0,1,1,1,1,0,1,1,1,1);s(m[9],0,0,0,0,0,0,0,1,0,1);for(int i=0;i<10;i++)for(int j=i+1;j<10;j++)swap(m[i][j],m[j][i]);m=mat_pow(m,n+1,MOD);/*for(int i=0;i<10;i++){for(int j=0;j<10;j++) cout<<m[i][j];cout<<endl;}*/a=mul(m,a,MOD);//for(int i=0;i<10;i++) cout<<a[i]<<endl;cout<<a[0]<<endl;return 0;}