引例: Matrix Power Series:
题目大意,给定矩阵A,求A^1+A^2+A^3+...A^N。
题解:已知X=a,可以通过以下矩阵求出ans=a^1+a^2+...a^N ans=矩阵^n后第一行之和-1=矩阵^(n+1)后右上格的和-1。
同理:矩阵也可以,只需要把1改为单位矩阵元即可。
左图a是常数,1就是1; 右图A是矩阵,1是单位元矩阵(主对角线是1)。
代码1:矩阵^N,第一行之和-1。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=70; int N,K,Mod; struct mat { int mp[maxn][maxn],len; mat(int x){ len=x; memset(mp,0,sizeof(mp)); } mat friend operator *(mat a,mat b) { mat res(a.len); for(int k=1;k<=res.len;k++) for(int i=1;i<=res.len;i++) for(int j=1;j<=res.len;j++) res.mp[i][j]=(res.mp[i][j]+a.mp[i][k]*b.mp[k][j])%Mod; return res; } mat friend operator ^(mat a,int x) { mat res(a.len); for(int i=1;i<=res.len;i++) res.mp[i][i]=1; while(x){ if(x&1)res=res*a; a=a*a; x>>=1; } return res; } }; int main() { scanf("%d%d%d",&N,&K,&Mod); mat array(N+N); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++){ scanf("%d",&array.mp[i][j]); } for(int i=1;i<=N;i++) array.mp[i][i+N]=array.mp[i+N][i+N]=1; array=array^(K); for(int i=1;i<=N;i++) array.mp[i][i+N]-=1; for(int i=1;i<=N;i++){ for(int j=1;j<N;j++) printf("%d ",(array.mp[i][j]+array.mp[i][j+N]+Mod)%Mod); printf("%d\n",(array.mp[i][N]+array.mp[i][N+N]+Mod)%Mod); } return 0; }