标签:
vijosP1194 Domino
【思路】
矩阵相乘。
参考Matrix67的文章:
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define FOR(a,b,c) for(int a=(b);a<(c);a++) 5 using namespace std; 6 7 const int maxn = 40; 8 const int ag[]={0,3,6,12,15,24,27,30}; 9 typedef long long LL; 10 11 int n,m,MOD; 12 13 struct Matrix{ 14 int r,c; 15 LL N[maxn][maxn]; 16 void init(int r,int c) { 17 this->r=r, this->c=c; 18 memset(N,0,sizeof(N)); 19 } 20 Matrix operator*(Matrix& B)const{ 21 Matrix A=*this,C; 22 C.init(A.r,B.c); 23 for(int i=0;i<C.r;i++) 24 for(int j=0;j<C.c;j++) 25 for(int k=0;k<A.c;k++) 26 C.N[i][j] = (C.N[i][j]+A.N[i][k]*B.N[k][j])%MOD; 27 return C; 28 } 29 Matrix pow(int p) { 30 Matrix tmp=*this; 31 Matrix ans; 32 ans.init(r,r); 33 for(int i=0;i<r;i++) ans.N[i][i]=1; 34 while(p) { 35 if(p&1) ans=ans*tmp; 36 tmp=tmp*tmp; 37 p>>=1; 38 } 39 return ans; 40 } 41 }; 42 int main() { 43 scanf("%d%d%d",&n,&m,&MOD); 44 Matrix ans; 45 int all=1<<m; 46 ans.init(all,all); 47 for(int i=0;i<all;i++) 48 for(int j=0;j<all;j++) 49 if( ((~i)&j) == ((~i)&(all-1))) { 50 int l=0; 51 for(int r=0;r<=8;r++) l=l||((i&j)==ag[r]); 52 ans.N[i][j]=l; 53 } 54 ans=ans.pow(n); 55 printf("%d",ans.N[all-1][all-1]); 56 return 0; 57 }
标签:
原文地址:http://www.cnblogs.com/lidaxin/p/4922609.html