矩阵快速幂+二分 poj3233

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <cstring>
 5 #include <stdlib.h>
 6 #include <math.h>
 7 #include <ctype.h>
 8 #include <queue>
 9 #include <map>
10 #include <set>
11 #include <algorithm>
12  
13 using namespace std;
14 int mod;
15 int n;
16 struct matrix
17 {
18     int ma[40][40];
19 }init, res;
20 matrix Mult(matrix x, matrix y)
21 {
22     int i,j,k;
23     matrix tmp;
24     memset(tmp.ma,0,sizeof(tmp.ma));
25     for(i=0;i<n;i++)
26     for(j=0;j<n;j++)
27     for(k=0;k<n;k++)
28     tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
29     return tmp;
30 }
31 matrix Pow(matrix x, int k)
32 {
33     matrix tmp;
34     int i,j;
35     memset(tmp.ma,0,sizeof(tmp.ma));
36     for(i=0;i<n;i++) tmp.ma[i][i]=1;
37     while(k){
38         if(k&1) tmp=Mult(tmp,x);
39         x=Mult(x,x);
40         k>>=1;
41     }
42     return tmp;
43 }
44 matrix add(matrix x, matrix y)
45 {
46     int i, j;
47     matrix tmp;
48     for(i=0;i<n;i++)
49     for(j=0;j<n;j++)
50     tmp.ma[i][j]=(x.ma[i][j]+y.ma[i][j])%mod;
51     return tmp;
52 }
53 matrix sum(matrix x, int k)
54 {
55     matrix tmp, y;
56     if(k==1) return x;
57     tmp=sum(x,k/2);
58     if(k&1){
59         y=Pow(x,k/2+1);
60         tmp=add(Mult(y,tmp),tmp);
61         return add(tmp,y);
62     }
63     else{
64         y=Pow(x,k/2);
65         return add(Mult(y,tmp),tmp);
66     }
67 }
68 int main()
69 {
70     int k,m,x,i,j;
71     scanf("%d%d%d",&n,&k,&mod);
72     for(i=0;i<n;i++){
73         for(j=0;j<n;j++){
74             scanf("%d",&x);
75             init.ma[i][j]=x%mod;
76         }
77     }
78     res=sum(init, k);
79     for(i=0;i<n;i++){
80         for(j=0;j<n;j++){
81             printf("%d",res.ma[i][j]);
82             if(j!=n-1) printf(" ");
83         }
84         puts("");
85     }
86     return 0;
87 }

 

posted @ 2019-09-10 22:57  古比  阅读(162)  评论(0编辑  收藏  举报