矩阵快速幂

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,m=1e9 + 7,c[1010][1010],a[1010][1010],a1[1010][1010],x[1010][1010];
void first(){
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
			x[i][j]=a1[i][j],a1[i][j]=0;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    		for(int k=1;k<=n;k++)
       			a1[i][j]=(a1[i][j]+(a[i][k]*x[k][j])%m)%m;
    return ;
}
void second(){
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	  x[i][j]=a[i][j],a[i][j]=0;
    for(int i=1;i<=n;i++)
     	for(int j=1;j<=n;j++)
    		for(int k=1;k<=n;k++)
    			a[i][j]=(a[i][j]+(x[i][k]*x[k][j])%m)%m;
    return ;
}
int ksm(int k){
	while(k){
        if(k%2==1) first();
        k/=2;
        second();
    }
	return 0;
}
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		a1[i][i] = 1;
	ksm(k);
    for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cout<<a1[i][j]<<" ";  
		cout<<endl;
	}
	return 0;
}
posted @ 2024-01-25 10:44  Arthur_Douglas  阅读(5)  评论(0编辑  收藏  举报