AcWing 883&884. 高斯消元解线性&线性异或方程组

#include<bits/stdc++.h>
using namespace std;

const int N = 110;
const double eps = 1e-8;

int n;

double a[N][N];

int gauss(){
	int r,c;
	for(r=0,c=0;c<n;c++){
		int t=r;
		for(int i=r+1;i<n;i++)
			if(fabs(a[i][c])>fabs(a[t][c])) t=i;
		if(fabs(a[t][c])<eps) continue;
		for(int i=c;i<n+1;i++) swap(a[r][i],a[t][i]);
		for(int i=n;i>=c;i--) a[r][i]/=a[r][c];
		for(int i=r+1;i<n;i++){
			if(fabs(a[i][c])>eps)
				for(int j=n;j>=c;j--) a[i][j]-=a[r][j]*a[i][c];
		}
		r++;
	}
	//cout<<r<<endl;
	if(r<n){
		for(int i=r;i<n;i++){
			if(fabs(a[i][n])>eps) return 2;
		}
		return 1;
	}
	for(int i=n-1;i>=0;i--){
		for(int j=i+1;j<n;j++) a[i][n]-=a[i][j]*a[j][n];
	}
	return 0;
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n+1;j++)
			cin>>a[i][j];
	
	int res=gauss();
	
	if(res==2) puts("No solution");
	else if(res==1) puts("Infinite group solutions");
	else{
		for(int i=0;i<n;i++)
			if(fabs(a[i][n])<eps) puts("0");
		else printf("%.2f\n",a[i][n]);
	}
	
	
	return 0;
}

异或:不进位加法

#include<bits/stdc++.h>
using namespace std;

const int N = 110;

int n;

int a[N][N];

int gauss(){
	int r,c;
	for(r=0,c=0;c<n;c++){
		int t=r;
		for(int i=r+1;i<n;i++)
			if(a[i][c]) t=i;
		if(!a[t][c]) continue;
		for(int i=c;i<n+1;i++) swap(a[r][i],a[t][i]);
		for(int i=r+1;i<n;i++){
			if(a[i][c])
				for(int j=n;j>=c;j--) a[i][j]-=a[r][j]*a[i][c];
		}
		for(int i=0;i<n;i++)
			for(int j=0;j<n+1;j++) a[i][j]&=1;
		r++;
	}
	//cout<<r<<endl;
	if(r<n){
		for(int i=r;i<n;i++){
			if(a[i][n]) return 2;
		}
		return 1;
	}
	for(int i=n-1;i>=0;i--){
		for(int j=i+1;j<n;j++) a[i][n]-=a[i][j]*a[j][n];
	}
	for(int i=0;i<n;i++)
		for(int j=0;j<n+1;j++) a[i][j]&=1;
	return 0;
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n+1;j++)
			cin>>a[i][j];
	
	int res=gauss();
	
	if(res==2) puts("No solution");
	else if(res==1) puts("Infinite group solutions");
	else{
		for(int i=0;i<n;i++) 
			cout<<a[i][n]<<endl;
	}
	
	
	return 0;
}
posted @ 2022-05-12 15:19  xhy666  阅读(68)  评论(0)    收藏  举报