10分求助!!
查看原帖
10分求助!!
1073879
Karl_Wan楼主2025/1/22 12:54

https://www.luogu.com.cn/record/199887617

#include <iostream>
using namespace std;
long long n,k; 
long long a[105][105],b[105][105],c[105][105],d[105][105];
const long long mod=1e9+7;
void chengfa(long long a[][105],long long b[][105],long long c[][105],long long n)//矩阵乘法函数 
{//          乘数1         乘数2          积      矩阵阶数 
	for(long long i=1;i<=n;i++)
	{
		for(long long j=1;j<=n;j++)
		{
			long long t=0;
			for(long long kk=1;kk<=n;kk++)
			{
				t+=(a[i][kk]*b[kk][j]);t%=mod;
			}
			c[i][j]=t;
		}
	}
}
void kuaisumi(int k)//快速幂函数 
{
	//c矩阵为结果矩阵
	//a矩阵为输入矩阵
	while(k)
	{
		if(k&1)
		{
			//c和a乘,结果存到d里 
			chengfa(c,a,d,n);
			//把D拷过来拷到C里
			for(long long i=1;i<=n;i++)
			{
				for(long long j=1;j<=n;j++)
				{
					c[i][j]=d[i][j];
				}
			 } 
		}
		//a自乘,结果存到B 
		chengfa(a,a,b,n);
		//然后把B拷到A里 
		for(long long i=1;i<=n;i++)
		{
			for(long long j=1;j<=n;j++)
			{
				a[i][j]=b[i][j];
			}
		} 
		//k>>=1 
		k>>=1;
	}
} 
int main()
{
	cin>>n;
	cin>>k;
	//0特判:0输出单位矩阵 
	if(k==0) {for(long long i=1;i<=n;i++){for(long long j=1;j<=n;j++){if(i==j) cout<<"1 ";else cout<<"0 ";}cout<<'\n';}return 0;}
	//输入 
	for(long long i=1;i<=n;i++)
	{
		for(long long j=1;j<=n;j++)
		{
			cin>>a[i][j];
			if(i==j) c[i][j]=1;//把C初始化成单位矩阵
		}
	}
	//快速幂 
	kuaisumi(k);
	//结果输出 
	for(long long i=1;i<=n;i++)
	{
		for(long long j=1;j<=n;j++)
		{
			cout<<c[i][j]<<' ';
		}
		cout<<'\n';
	}
	
	return 0;
}
2025/1/22 12:54
加载中...