关于矩阵一些问题
  • 板块学术版
  • 楼主3493441984zz
  • 当前回复71
  • 已保存回复71
  • 发布时间2023/3/14 10:36
  • 上次更新2023/10/23 21:36:40
查看原帖
关于矩阵一些问题
96968
3493441984zz楼主2023/3/14 10:36

想知道如果这题矩阵大一点,比如700*700之后在函数里定义矩阵就会爆掉,我只知道在外面定义,但是这样就会很丑,想知道如何写能够更简便

本人代码(100*100)求教谢谢:

#include<bits/stdc++.h>
#define int long long
#define inf 1e18
#define inc 0xcfcfcfcf
#define N 107
#define M 500007
#define mod 1000000007
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
int T=1,n,k;
struct Mrx
{
	int g[N][N];
	void Init_Z()
	{
		memset(g,0,sizeof(g));
	}
	void Init_E()
	{
		memset(g,0,sizeof(g));
		for(int i=1;i<=n;++i)
			g[i][i]=1;
	}
	Mrx operator * (const Mrx x) const
	{
		Mrx y;
		y.Init_Z();
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				for(int k=1;k<=n;++k)
					y.g[i][j]+=g[i][k]*x.g[k][j]%mod,y.g[i][j]%=mod;
		return y;
	}
};
Mrx Pow_mrx(Mrx x,int k)
{
	Mrx ans;
	ans.Init_E();
	while(k>0)
	{
		if(k&1)
			ans=ans*x;
		x=x*x;
		k>>=1;
	}
	return ans;
}
bool Solve()
{
 	//freopen("test.in","r",stdin);
	scanf("%lld%lld",&n,&k);
	Mrx a;
	a.Init_Z();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			scanf("%lld",&a.g[i][j]);
	Mrx ans=Pow_mrx(a,k);
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
			printf("%lld ",ans.g[i][j]);
		printf("\n");
	}
	return true;
}
signed main()
{
	//scanf("%lld",&T);
	while(T--)
		if(!Solve())
			printf("-1\n");
	return 0;
}
/*
-std=c++11
-std=c99
*/


2023/3/14 10:36
加载中...