递推+矩阵快速幂 HDU 2065

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 //矩阵大小上限
 8 const int SIZ=100;
 9 int MOD=100;
10 
11 //矩阵大小为n*m,初始化全部为0
12 struct mat
13 {
14     int n,m;
15     int ar[SIZ][SIZ];
16     mat()
17     {
18         memset(ar,0,sizeof(ar));
19         n=m=SIZ;
20     };
21 };
22 
23 //矩阵乘法
24 mat operator *(mat a,mat b)
25 {
26     mat c;
27     c=mat();
28     c.n=a.n;
29     c.m=b.m;
30     for(int i=1;i<=a.n;i++)
31         for(int j=1;j<=b.n;j++)
32             if(a.ar[i][j]!=0)
33             for(int k=1;k<=a.m;k++)
34             {
35                 c.ar[i][k]+=(a.ar[i][j]*b.ar[j][k])%MOD;
36                 c.ar[i][k]%=MOD;
37             }
38     return c;
39 }
40 
41 //矩阵快速幂
42 mat operator ^(mat a,long long k)
43 {
44     mat c;
45     c=mat();
46     c.n=a.n;
47     c.m=a.m;
48     for(int i=1;i<=a.n;i++)
49         c.ar[i][i]=1;
50     while(k)
51     {
52         if(k&1)
53             c=c*a;
54         a=a*a;
55         k/=2;
56     }
57     return c;
58 }
59 
60 int main()
61 {
62     int T;
63     while(scanf("%d",&T)!=EOF)
64     {
65         if(T==0)
66             break;
67         for(int l=1;l<=T;l++)
68         {
69             long long n;
70             mat a;
71             a.m=a.n=4;
72             for(int i=1;i<=4;i++)
73             {
74                 for(int j=1;j<=4;j++)
75                 {
76                     a.ar[i][j]=1;
77                     if(i==j)
78                         a.ar[i][j]=2;
79                     if(i+j==5)
80                         a.ar[i][j]=0;
81                 }
82             }
83             scanf("%I64d",&n);
84             mat b=a^n;
85             int ans=b.ar[1][1];
86             cout<<"Case "<<l<<": "<<ans<<endl;
87         }
88         cout<<endl;
89     }
90     return 0;
91 }
View Code

 

posted @ 2015-08-29 10:47  相儒以沫  阅读(147)  评论(0编辑  收藏  举报