矩阵快速幂
#include<iostream> #include<math.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #define maxn 30 using namespace std; struct Matrax{ int m[maxn][maxn]; }; Matrax a,per; int n,M; void init(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a.m[i][j]); a.m[i][j]%=M; per.m[i][j]=(i==j); //单位矩阵,任何矩阵乘以单位矩阵其值不变 } } } Matrax multi(Matrax a,Matrax b){ //矩阵相乘: Matrax 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; } //矩阵快速幂 思想等同于 整数快速幂 Matrax power(int k){ Matrax c,p,ans=per; p=a; while(k){ if(k&1){ ans=multi(ans,p); k--; }else{ k/=2; p=multi(p,p); } } return ans; } Matrax add(Matrax a,Matrax b){ Matrax 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; } Matrax Sum(int k){ Matrax temp=per,b; if(k==1) return a; temp=add(temp,power(k/2)); temp=multi(temp,Sum(k/2)); if(k&1){ temp=add(temp,power(k)); } return temp; } int main() { long long k; Matrax s,res; while(scanf("%d%d%d",&n,&k,&M)!=EOF){ init(); s=Sum(k); for(int i=0;i<n;i++){ for(int j=0;j<n-1;j++){ printf("%d ",s.m[i][j]); } printf("%d\n",s.m[i][n-1]); } } return 0; }