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

 

 

 

 

posted @ 2013-10-10 22:03  _随心所欲_  阅读(390)  评论(0编辑  收藏  举报