矩阵
1113 矩阵快速幂
给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。
输入
第1行:2个数N和M,中间用空格分隔。N为矩阵的大小,M为M次方。(2 <= N <= 100, 1 <= M <= 10^9)
第2 - N + 1行:每行N个数,对应N * N矩阵中的1行。(0 <= N[i] <= 10^9)
输出
共N行,每行N个数,对应M次方Mod (10^9 + 7)的结果。
输入样例
2 3
1 1
1 1
输出样例
4 4
4 4
话说画一个小时debug最后发现交错了语言是一种什么感受。。。(真难受)
ac代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node{
long long int m[110][110];
};
const int mod=1e9+7;
int b,f;
node mul(node a,node b){
node ans;
memset(ans.m ,0,sizeof(ans.m ));
for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
for(int k=1;k<=f;k++){
ans.m [i][j]=(ans.m [i][j]+a.m [i][k]*b.m [k][j]%mod+mod)%mod;
}
}
}
return ans;
}
node ksm(node a,int b){
node res;
memset(res.m ,0,sizeof(res.m ));
for(int i=1;i<=f;i++){
res.m [i][i]=1;
}
while(b){
if(b&1){
res=mul(res,a);
}
b>>=1;
a=mul(a,a);
}
return res;
}
int main(){
node a,bb;
cin>>f>>b;
for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
cin>>a.m [i][j];
}
}
bb=ksm(a,b);
for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++)
cout<<bb.m [i][j]<<" ";
cout<<endl;
}
return 0;
}