http://poj.org/problem?id=3233
Problem Solving Matrix Quick Power + Bisection Equivalence Sequence Summation
AC code
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 35; const int inf = 0x3f3f3f3f,mod = 1000000007; const doubleepx = 1e- 10 ; typedef long long ll; struct Matrix { int m[maxn][maxn]; //Does anyone know why the array will get a Runtime Error if the array is too large }; Matrix A,I; int n,m,k; Matrix add(Matrix a,Matrix b) { Matrix c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c.m[i][j]=a.m[i][j]+b.m[i][j]; c.m[i][j]%=m; } } return c; } Matrix multi(Matrix a,Matrix b) { Matrix c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c.m[i][j]=0; for(int k=0;k<n;k++) { c.m[i][j]+=a.m[i][k]*b.m[k][j]; } c.m[i][j]%=m; } } return c; } Matrix poww(Matrix a,int n) { Matrix ans=I; while(n>0) { if(n&1) years = multi(years,a); n=n>>1; a=multi(a,a); } return ans; } Matrix sum(Matrix a,int n) { if(n==1) return a; Matrix t=sum(a,n/2); if(n&1) { Matrix cur=poww(a,n/2+1); t=add(t,multi(t,cur)); t=add(t,cur); } else { Matrix cur=poww(a,n/2); t=add(t,multi(t,cur)); } return t; } intmain () { cin>>n>>k>>m; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>A.m[i][j]; A.m[i][j]%=m; I.m[i][j]=(i==j); } } Matrix ans=sum(A,k); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cout<<ans.m[i][j]<<" "; } cout<<endl; } return 0; }