自己用 O(n3) 的正确复杂度做的,交了好几次都是前三个点都是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;
}