只对最后一个点求调
查看原帖
只对最后一个点求调
754006
mobaiawa楼主2024/9/16 15:53
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
	ll res=0;short int op=1;char ch=getchar();
	while(ch<'0'||'9'<ch){if(ch=='-')op=-op;ch=getchar();}
	while('0'<=ch&&ch<='9'){res=res*10+ch-'0';ch=getchar();}
	return res*op;
}
void write(ll x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
const int N=110,P=1e9+7;
struct matrix{
	int spa;
	ll dat[N][N];
	void _(){//造单位矩阵 
		memset(dat,0,sizeof dat);
		for(int i=1;i<=spa;i++)dat[i][i]=1;
	}
	matrix operator*(const matrix &b){
		matrix res;
		res.spa=spa;
		for(int i=1;i<=spa;i++){
			for(int _=1;_<=spa;_++){
				for(int j=1;j<=spa;j++){
					res.dat[i][j]=(res.dat[i][j]+dat[i][_]*b.dat[_][j]%P)%P;
				}
			}
		}
		return res;
	}
};
matrix pow(matrix x,int n){//快速幂 
	matrix res=x;
	res._();
	while(n){
		if(n&1)res=res*x;
		n>>=1;
		x=x*x;
	}
	return res;
}
int main(){
	int n,k;
	matrix x;
	cin>>n>>k;
	x.spa=n;
	for(int i=1;i<=x.spa;i++){//读入 
		for(int j=1;j<=x.spa;j++){
			x.dat[i][j]=read();
		}
	}
	matrix res=pow(x,k);
	for(int i=1;i<=res.spa;i++){//输出 
		for(int j=1;j<=res.spa;j++){
			write(res.dat[i][j]);putchar(' ');
		}
		putchar('\n');
	}
	return 0;
}
2024/9/16 15:53
加载中...