矩阵 1113 矩阵快速幂

矩阵

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;
}
上一篇:1113 Integer Set Partition


下一篇:2021-10-02