萌新刚学两秒半OI,不知道怎么判断无穷多解
查看原帖
萌新刚学两秒半OI,不知道怎么判断无穷多解
504093
dyc2022楼主2023/9/11 16:33

rt,本人的思路是使用高斯消元,然后判断:

如果有 0xi=00x_i=0 的方程,那么有无数解。

如果 0xi≠00x_i \not=0,那么无解。

可是……https://www.luogu.com.cn/record/124428711

完整代码:

#include<bits/stdc++.h>
using namespace std;
double a[128][128];
const double eps=1e-7;
int n,flag=0;
main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
	for(int i=1;i<=n;i++)
	{
		int maxj=i;
		for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[maxj][i]))maxj=j;
		for(int j=1;j<=n+1;j++)swap(a[i][j],a[maxj][j]);
		if(fabs(a[i][i])<eps)continue;
		for(int j=n+1;j>=i;j--)a[i][j]/=a[i][i];
		for(int j=1;j<=n;j++)
		{
			if(i==j)continue;
			double base=a[j][i];
			for(int k=i;k<=n+1;k++)a[j][k]-=base*a[i][k];
		}
	}
	for(int j=1;j<=n;j++)
	{
		if(fabs(a[j][j])<eps)
		{
			flag=1;
			if(fabs(a[j][n+1])>=eps)puts("-1");
			return 0;
		}
	}
	if(flag)puts("0");
	else for(int j=1;j<=n;j++)printf("x%d=%.2lf\n",j,a[j][n+1]);
	return 0;
}

/bx

2023/9/11 16:33
加载中...