求助:这个题卡常数卡得这么死吗?
查看原帖
求助:这个题卡常数卡得这么死吗?
115947
huangx607087楼主2022/4/3 19:22

自己用 O(n3)O(n^3) 的正确复杂度做的,交了好几次都是前三个点都是30ms,最后7个点TLE,看了看AC的提交结果,都是前三个点19ms,其他七个点600多ms。

自己用freopen本地造了个400×400的数据测了一下,用了2.5秒,结果是正确的 所以算法复杂度正确了还能怎么优化,求助

#include<bits/stdc++.h>
using namespace std;
long long  n,m,a[900][1800],p=1e9+7;
long long inverse(long long x)
{
	long long i,j,res=1;
	const string s="0111011100110101100101000000101";
	for(i=1;i<s.length();i++)
	{
		res=res*res%p;
		if(s[i]-48) res=res*x%p;
	}
	return res;
}
void debug(int x=0)
{
	int i,j; 
	for(i=1;i<=n;i++)
	{
		for(j=x+1;j<=2*n;j++) printf("%lld " ,a[i][j]);
		printf("\n"); 
	}
}

int main()
{
	int i,j,k;
	scanf("%u",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			scanf("%lld",&a[i][j]);
		a[i][n+i]=1;
	}
	for(i=1;i<=n;i++)
	{
		for(j=i;j<=n;j++)
		{
			if(a[j][i])
			{
				swap(a[i],a[j]);
				break;
			}
		}
		if(a[i][i]==0) return 0;
		long long invaii=inverse(a[i][i]);
		for(j=i;j<=2*n;j++)
			a[i][j]=a[i][j]*invaii%p;
		for(j=1;j<=n;j++)
		{
			if(i!=j)
			{
				long long cnt=a[j][i]%p;
				for(k=i;k<=2*n;k++)
					a[j][k]=(a[j][k]-cnt*a[i][k]%p+p)%p;
			}
		}
	}
	debug(n);
	return 0;
} 
2022/4/3 19:22
加载中...