题解 | 矩阵幂

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n,k;
	while(cin>>n>>k) {
		int a[n][n],b[n][n];
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				cin>>a[i][j];
				b[i][j] = i==j?1:0;
			}
		}
		while(k!=0) {
			int tmp[n][n];
			if(k%2==1) {
				for(int i=0; i<n; i++) {
					for(int j=0; j<n; j++) {
						tmp[i][j]=0;
						for(int k=0; k<n; k++) {
							tmp[i][j]+=b[i][k]*a[k][j];
						}
					}
				}
				for(int i=0; i<n; i++) {
					for(int j=0; j<n; j++) {
						b[i][j]=tmp[i][j];
					}
				}

			}
			k/=2;
			for(int i=0; i<n; i++) {
				for(int j=0; j<n; j++) {
					tmp[i][j]=0;
					for(int k=0; k<n; k++) {
						tmp[i][j]+=a[i][k]*a[k][j];
					}
				}
			}
			for(int i=0; i<n; i++) {
				for(int j=0; j<n; j++) {
					a[i][j]=tmp[i][j];
				}
			}
		}
		for(int i=0;i<n;i++){
		    for(int j=0;j<n;j++){
		        cout<<b[i][j]<<" ";
		    }
		    cout<<endl;
		}
	}
}

这里使用快速幂的逻辑就是每个部分的计算都是乘法,那么同理的可以用快速幂的方式优化乘法的计算,然后对于算子,是矩阵,所以要实现矩阵的乘法,我这里不方便写在外面,直接内部实现了

全部评论

相关推荐

05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务