自己用O(n3)写的,T了五个点,自己测试规模400的数据的时候,耗时约1.5秒,有什么地方还可以优化吗?
#include<bits/stdc++.h>
using namespace std;
long long a[450][900],n,p=1e9+7;
void debug()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n;j++)
printf("%lld ",a[i][j]);
printf("\n");
}
}
long long inverse(long long x,long long e=1e9+5)
{
if(e==0)
return 1;
long long s=inverse(x,e/2)%p;
if (e&1)
return s*s%p*x%p;
else
return s*s%p;
}
int SolveDown()
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
if(a[j][i]!=0)
break;
}
if(j>n)
return 0;
if(j!=i)
{
for(k=1;k<=2*n;k++)
{
long long tmp=a[i][k];
a[i][k]=a[j][k];
a[j][k]=tmp;
}
}
long long inv=inverse(a[i][i]);
for(j=1;j<=2*n;j++)
a[i][j]=(a[i][j]*inv)%p;
for(j=i+1;j<=n;j++)
{
long long tim=a[j][i];
for(k=i;k<=2*n;k++)
a[j][k]=(a[j][k]+tim*((p-a[i][k])%p))%p;
}
}
return 1;
}
int SolveUp()
{
int i,j,k;
for(i=n;i>=1;i--)
{
for(j=i-1;j>=1;j--)
{
long long tim=a[j][i];
for(k=i;k<=2*n;k++)
a[j][k]=(a[j][k]+tim*((p-a[i][k])%p))%p;
}
}
}
int main()
{
int i,j,k;
scanf("%lld",&n);
/*n=400;
freopen("1.txt","r",stdin);
freopen("2.txt","w",stdout);*/
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
for(i=1;i<=n;i++) a[i][n+i]=1;
int judg=SolveDown();
if(!judg)
{
printf("No Solution\n");
return 0;
}
SolveUp();
//debug();
for(i=1;i<=n;i++)
{
for(j=n+1;j<=2*n;j++)
printf("%lld ",a[i][j]);
printf("\n");
}
return 0;
}