lightoj 1244 - Tiles 状态DP

思路:状态DP

dp[i]=2*dp[i-1]+dp[i-3]

代码如下:

求出循环节部分

 1 #include<stdio.h> 2 #define m 10007 3 int p[m]; 4 int main() 5 { 6 p[0]=p[1]=1;p[2]=2; 7 for(int i=3;i<m;i++){ 8 p[i]=2*p[i-1]+p[i-3]; 9 p[i]%=m; 10 } 11 int t,ca=0,n; 12 scanf("%d",&t); 13 while(t--){ 14 scanf("%d",&n); 15 printf("Case %d: %d\n",++ca,p[n%(m-1)]); 16 } 17 return 0; 18 }
View Code

 

用矩阵快速幂求

 

 1 #include<stdio.h> 2 #include<cstring> 3 #define mod 10007 4 struct mat 5 { 6 int m[3][3]; 7 }e,d; 8 int an[3]={2,1,1}; 9 mat Mul(mat a,mat b) 10 { 11 mat ans; 12 for(int i=0;i<3;i++) 13 for(int j=0;j<3;j++){ 14 ans.m[i][j]=0; 15 for(int k=0;k<3;k++) 16 ans.m[i][j]+=a.m[i][k]*b.m[k][j]; 17 ans.m[i][j]%=mod; 18 } 19 return ans; 20 } 21 int Pow(int n) 22 { 23 mat ans=e,a=d; 24 while(n){ 25 if(n&1) ans=Mul(ans,a); 26 n>>=1; 27 a=Mul(a,a); 28 } 29 return ans.m[0][0]; 30 } 31 int main() 32 { 33 memset(e.m,0,sizeof(e.m)); 34 memset(d.m,0,sizeof(d.m)); 35 for(int i=0;i<3;i++) e.m[0][i]=an[i]; 36 d.m[0][1]=d.m[1][2]=d.m[2][0]=1; 37 d.m[0][0]=2; 38 int t,n,ca=0; 39 scanf("%d",&t); 40 while(t--){ 41 scanf("%d",&n); 42 printf("Case %d: ",++ca); 43 if(n==1) printf("1\n"); 44 else printf("%d\n",Pow(n-2)); 45 } 46 return 0; 47 }
View Code

 

 

 

 

你可能感兴趣的:(tiles)