不知道为啥爆WA了,求解
查看原帖
不知道为啥爆WA了,求解
559578
Red_Maple楼主2022/7/26 01:09
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define mm 1000000007

using namespace std;

typedef long long ll;
ll n,k;

struct node
{
	ll G[105][105];
}A,ans;

//重载运算符
node operator *(node p,node q)
{
	node x;//用来储存矩阵相乘的结果
	
	//将数组初始化
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= 1;j++)
		{
			x.G[i][j] = 0;
		}
	}
	
	/*
	矩阵相乘是对应的行和列相乘,
	故c[i][j]时对应的p的第i行和q的第j列的结果
	*/
	for(int i = 1;i <= n;i++) 
	{
		for(int j = 1;j <= n;j++)
		{
			for(int h = 1;h <= n;h++)
			{
				x.G[i][j] = (x.G[i][j] + (p.G[i][h] * q.G[h][j]) % mm) % mm;//行和列相乘并取余
			}
		}
	}
	
	return x;
}

node fun(node x,long long b)
{
	if(b == 0)
	{
		node unit_matrix;//返回单位矩阵
		
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= n;j++)
			{
				if(i == j)
				{
					unit_matrix.G[i][j] = 1;
				}
				else
				{
					unit_matrix.G[i][j] = 0;
				}
			}
		}
		return unit_matrix;
	}
	else if(b == 1)
	{
		return x;
	}
	
	if(b & 1)
	{
		return x * fun(x,b-1);
	}
	else
	{
		node r = x * fun(x,b/2);
		return r * r;
	}
}

int main(void)
{
	cin>>n>>k;
	
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			cin>>A.G[i][j];
		}
	}
	
	ans = fun(A,k);
	
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			cout<<ans.G[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}
2022/7/26 01:09
加载中...