POJ-3233 Matrix Power Series
题意:给出n、k、m和n*n的矩阵,求S = A + A^2 + A^3 + … + A^k,结果mod m。
思路:
构造一个矩阵
A I
O I
自乘后
A^2 I+A
O I
乘3次为
A^3 I+A+A^2
O I
直接二分幂。(神奇的构造~)
题目链接:http://poj.org/problem?id=3233
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=62; 10 11 typedef struct Matrix{ 12 long long m[N][N]; 13 }Matrix; 14 Matrix init,unit; 15 int n,k,m; 16 17 void Init(){ 18 scanf("%d%d%d",&n,&k,&m); 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=n;j++) 21 scanf("%lld",&init.m[i][j]); 22 for(int i=1;i<=n;i++){ 23 init.m[i][n+i]=1; 24 init.m[n+i][n+i]=1; 25 } 26 for(int i=1;i<=2*n;i++) 27 for(int j=1;j<=2*n;j++) 28 unit.m[i][j]=(i==j); 29 } 30 31 Matrix Mul(Matrix a,Matrix b){ 32 Matrix c; 33 for(int i=1;i<=2*n;i++) 34 for(int j=1;j<=2*n;j++){ 35 c.m[i][j]=0; 36 for(int k=1;k<=2*n;k++) 37 c.m[i][j]+=a.m[i][k]*b.m[k][j]; 38 c.m[i][j]%=m; 39 } 40 return c; 41 } 42 43 Matrix Pow(Matrix a,Matrix b){ 44 k++; 45 while(k){ 46 if(k&1) b=Mul(a,b); 47 a=Mul(a,a); 48 k>>=1; 49 } 50 return b; 51 } 52 53 int main(){ 54 55 // freopen("data.in","r",stdin); 56 // freopen("data.out","w",stdout); 57 58 Init(); 59 Matrix x=Pow(init,unit); 60 for(int i=1;i<=n;i++) 61 for(int j=n+1;j<=2*n;j++){ 62 if(i==j&&x.m[i][j]==0) x.m[i][j]=m; 63 if(j-i==n) x.m[i][j]--; 64 printf(j==n*2?"%lld\n":"%lld ",x.m[i][j]); 65 } 66 return 0; 67 }