题解 | 矩阵幂

#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;
		}
	}
}

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

全部评论

相关推荐

2024-12-20 23:04
门头沟学院 C++
金山办公 C++开发 n*14
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务