全紫求助
查看原帖
全紫求助
373648
金刚xkb楼主2021/7/15 17:09
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p=1e9+7;
int n;
ll k;
struct qua
{
	ll a[110][110];
	qua operator = (qua x)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				a[i][j]=x.a[i][j];
			}
		}
	}
}q,a1;
qua operator * (qua x,qua y)
{
	qua re;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			ll sum=0;
			for(int t=1;t<=n;t++)
			{
				sum+=x.a[i][t]*y.a[t][j];
				sum%=p;
			}
			re.a[i][j]=sum;
		}
	}
	return re;
}
qua quick_pow(qua x,ll y)
{
	qua ta=a1;//ta=1;
	while(y)
	{
		if(y&1) ta=ta*x;
		y>>=1;
		x=x*x;
	}
	return ta;
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			a1.a[i][j]=0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		a1.a[i][i]=1;
	}
	if(k==0)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				printf("%d ",a1.a[i][j]);
			}
			printf("\n");
		}
		return 0;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&q.a[i][j]);
	q=quick_pow(q,k);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%d ",q.a[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2021/7/15 17:09
加载中...