POJ 3233 Matrix Power Series

     题目来源:http://poj.org/problem?id=3233

    矩阵的快速幂。写完这份代码提交后Time Limit Exceeded,更改一小部分后,发现仍然是Time Limit Exceeded,然后无语了,

从网上看了一份代码,以为自己的二分递归还有运算符重载时间用的比较多(这个想法太天真了,哈哈),然后照着网上的代码重新

写了一份,重新提交仍然是Time Limit Exceeded,这就让我很无语了。后来发现是我数据类型设置有问题,long long数据格式运行

占用的时间稍长。改成int后AC

二分法:

    幂

    偶数:A^K=A^(K/2)*A^(K/2)

    奇数:A^K=A^(K/2)*A^(K/2)*K

    幂求和:

    偶数:sum=A+A^2+...+A^K=(A+A^2+...+A^(K/2))*(1+A^(K/2))

    奇数:sum=A+A^2+...+A^K=(A+A^2+...+A^(K/2+1))*(1+A^(K/2+1))+A^(K/2+1)

 

 1 /*参考网上的代码*/
 2 #include<stdio.h>
 3 const int maxn=35;
 4 int n,k,mod;
 5 struct matrix{
 6     int mat[maxn][maxn];
 7 }m,sum,unit;
 8 matrix mul(matrix t1,matrix t2)
 9 {
10         matrix temp;
11         for(int i=1;i<=n;i++)
12         for(int j=1;j<=n;j++){
13             temp.mat[i][j]=0;
14             for(int k=1;k<=n;k++){
15                 temp.mat[i][j]+=t1.mat[i][k]*t2.mat[k][j]%mod;
16                 temp.mat[i][j]%=mod;
17             }
18         }
19         return temp;
20 }
21 matrix add(matrix t1,matrix t2)
22 {
23         matrix temp;
24         for(int i=1;i<=n;i++)
25         for(int j=1;j<=n;j++)
26             temp.mat[i][j]=(t1.mat[i][j]+t2.mat[i][j])%mod;
27         return temp;
28 }
29 matrix binsearch(int k)
30 {
31     matrix ans,t;
32     ans=m;
33     t=unit;
34     while(k!=1){
35         if(k&1){
36             k--;
37             t=mul(ans,t);
38         }
39         else{
40             k=k>>1;
41             ans=mul(ans,ans);
42         }
43     }
44     return mul(t,ans);
45 }
46 matrix matsum(int k)
47 {
48     matrix ans;
49     if(k==1)
50       ans=m;
51     else{
52         matrix temp=matsum(k/2);
53         if(k&1){
54             matrix binans=binsearch(k/2+1);
55             ans=add(temp,mul(temp,binans));
56             ans=add(ans,binans);
57         }
58         else{
59             ans=add(temp,mul(temp,binsearch(k/2)));
60         }
61     }
62     return ans;
63 }
64 int main()
65 {
66         scanf("%d%d%d",&n,&k,&mod);
67         for(int i=1;i<=n;i++)
68         for(int j=1;j<=n;j++){
69              scanf("%d",&m.mat[i][j]);
70              unit.mat[i][j]=(i==j);
71         }
72         sum=matsum(k);
73         for(int i=1;i<=n;i++){
74              for(int j=1;j<=n;j++)
75              printf("%d ",sum.mat[i][j]);
76              printf("\n");
77         }
78     return 0;
79 }

 

 1 #include<stdio.h>
 2 const int maxn=35;
 3 int n,k,mod;
 4 struct matrix{
 5      int mat[maxn][maxn];
 6      matrix operator*(const matrix &t)
 7      {
 8         matrix temp;
 9         for(int i=1;i<=n;i++)
10         for(int j=1;j<=n;j++){
11             temp.mat[i][j]=0;
12             for(int k=1;k<=n;k++){
13                 temp.mat[i][j]+=mat[i][k]*t.mat[k][j]%mod;
14                 temp.mat[i][j]%=mod;
15             }
16         }
17         return temp;
18      }
19     matrix operator+(const matrix &t)
20     {
21         matrix temp;
22         for(int i=1;i<=n;i++)
23         for(int j=1;j<=n;j++)
24             temp.mat[i][j]=(mat[i][j]+t.mat[i][j])%mod;
25         return temp;
26     }
27 }m,sum;
28 matrix binsearch(int k)
29 {
30     matrix ans;
31     if(k==1)
32     ans=m;
33     else{
34         ans=binsearch(k/2);
35         ans=ans*ans;
36         if(k&1)
37             ans=ans*m;
38     }
39     return ans;
40 }
41 matrix matsum(int k)
42 {
43     matrix ans;
44     if(k==1)
45       ans=m;
46     else{
47         matrix temp=matsum(k/2);
48         if(k&1){
49             matrix binans=binsearch(k/2+1);
50             ans=temp+temp*binans+binans;
51         }
52         else{
53             ans=temp+temp*binsearch(k/2);
54         }
55     }
56     return ans;
57 }
58 int main()
59 {
60         scanf("%d%d%d",&n,&k,&mod);
61         for(int i=1;i<=n;i++)
62         for(int j=1;j<=n;j++)
63         scanf("%d",&m.mat[i][j]);
64         sum=matsum(k);
65         for(int i=1;i<=n;i++){
66              for(int j=1;j<=n;j++)
67              printf("%d ",sum.mat[i][j]);
68              printf("\n");
69         }
70     return 0;
71 }
posted on 2014-07-21 20:58  BMESwimming  阅读(175)  评论(0编辑  收藏  举报