话说求逆矩阵时间复杂度是$O(n^3)$吗?
查看原帖
话说求逆矩阵时间复杂度是$O(n^3)$吗?
115947
huangx607087楼主2021/10/30 17:31

自己用O(n3)O(n^3)写的,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; 
} 
2021/10/30 17:31
加载中...