矩阵——poj3233Matrix Power Series
http://poj.org/problem?id=3233
从《十个利用矩阵乘法解决的经典题目》里面看到的
首先感谢
Matrix67
大佬
然后发现这个人的名字和题目名很像;
A + A^2 + A^3 + A^4 + A^5 + A^6 =
(A + A^2 + A^3) + A^3*(A + A^2 + A^3)
关于奇偶自己搞就好了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Ll long long
using namespace std;
struct jv{
int n,m;
int a[31][31];
jv(){n=m=0;memset(a,0,sizeof a);}
}a,ans;
int n,mo,k;
jv cheng(jv a,jv b){
jv ans; ans.n=a.n; ans.m=b.m;
for(int i=1;i<=a.n;i++)
for(int k=1;k<=a.m;k++)if(a.a[i][k])
for(int j=1;j<=b.m;j++)
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mo;
return ans;
}
jv jia(jv a,jv b){
jv ans; ans.n=a.n; ans.m=b.m;
for(int i=1;i<=a.n;i++)
for(int j=1;j<=b.m;j++)
ans.a[i][j]=(a.a[i][j]+b.a[i][j])%mo;
return ans;
}
jv ksm(int y){
jv ans=a,c=a;
y-=1;
while(y){
if(y&1)ans=cheng(ans,c);
y>>=1;
c=cheng(c,c);
}
return ans;
}
jv find(int k){
if(k==1)return a;
if(k&1)return jia(ksm(k),find(k-1));
jv c=find(k/2);//要先提出
return jia(c,cheng(c,ksm(k/2)));
}
int main(){
scanf("%d%d%d",&n,&k,&mo);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a.a[i][j]);
a.n=n; a.m=n;
ans=find(k);
for(int i=1;i<=ans.n;i++){
for(int j=1;j<=ans.m;j++)
printf("%d ",ans.a[i][j]);printf("\n");
}
}