只有30pts,其余全部超时,求助
查看原帖
只有30pts,其余全部超时,求助
87651
www2003楼主2021/11/10 19:13
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

#define pb push_back
#define qr read()
#define LL long long
#define ff first
#define ss second
#define in inline
#define reg register
#define pa pair<int,int>
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define per(i,a,b) for(int i = (a); i >= (b); i--)

using namespace std;
const int MAXN=0x3f3f3f3f;
const int MAXL=0x7ffff;
#define N 410
inline int read()
{
	int x=0,k=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*k;
}

int n,p;
LL a[N][N],e[N][N];

LL fp(LL A,int B)
{
	LL ans = 1;
	while(B)
	{
		if(B & 1)ans = ans * A % p;
		A = A * A % p;
		B >>= 1;
	}
	return ans;
}

int solve()
{
	for(reg int i = 1; i <= n; i++)
	{
		reg int j = i,r = 0;
		for(; j <= n; j++)
		{
			if(a[j][i] > a[r][i])r = j;
		}
		if(!r)return 0;
		if(i!=r)swap(a[i],a[r]);if(i!=r)swap(e[i],e[r]);
		int inv = fp(a[i][i],p - 2);
		for(reg int k = 1; k <= n; k++)
		{
			if(k == i)continue;
			int INV = a[k][i] * inv % p;
			for(reg int j = 1; j <= n; j++)
			{
				e[k][j] = (e[k][j] - INV * e[i][j] % p + p) % p;
			}
			for(reg int j = i; j <= n; j++)
			{
				a[k][j] = (a[k][j] - INV * a[i][j] % p + p) % p;
			}	
		}	
		for(reg int k = i; k <= n; k++)a[i][k] = a[i][k] * inv % p;
		for(reg int k = 1; k <= n; k++)e[i][k] = e[i][k] * inv % p;
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			printf("%lld ",e[i][j]);
		}
		printf("\n");
	}
	return 1;
}

int main()
{
	p = 1e9 + 7;
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			scanf("%lld",&a[i][j]);
		}
		e[i][i] = 1;
	}
	if(solve())return 0;
	cout << "No Solution";
}
2021/11/10 19:13
加载中...