高斯消元(整数型)模板 && 高斯消元(实数型)模板 && 高斯消元(异或型)

整数
#include
#include
using namespace std;

#define LL long long
#define Len 105

//从1开始。不使用0位置。 


struct Martix
{
	LL m[Len][Len];
	LL ans[Len]; //最终解
	int con; // 0 表示唯一解 1 表示多解 2 表示无解 
}Ma;
int m;//矩阵长 

LL gcd(LL a,LL b) //最大公约数 
{
	return b?gcd(b,a%b):a;
}
LL lcm(LL a,LL b) //最小公倍数
{
	LL c=gcd(a,b);
	return a/c*b;
} 

//矩阵操作 
void Mul(int a,int p) //第 x 行 同乘 p 
{
	for(int i=1;i<=m+1;i++)
	Ma.m[a][i]*=p;
}
void Sub(int a,int x,int b,int y) //第 a 行 的 x 倍 减去 b 行 的 y 倍 
{
	for(int i=1;i<=m+1;i++){
		Ma.m[a][i]=Ma.m[a][i]*x-Ma.m[b][i]*y;
	}
}
void exch(int a,int b) // 交换 a,b 两行
{
	for(int i=1;i<=m+1;i++){
		Ma.m[a][i]^=Ma.m[b][i];
		Ma.m[b][i]^=Ma.m[a][i];
		Ma.m[a][i]^=Ma.m[b][i];
	} 
}  
// 
void Gauss1()  // m 阶矩阵 标准矩阵 
{
	
	for(int i=1;i<=m;i++){
		if(Ma.m[i][i]==0){
			for(int j=i+1;j<=m;j++){
				if(Ma.m[j][i]){
					exch(i,j);
				}
			}
			if(Ma.m[i][i]==0){
				Ma.con=1;
				continue;
			}
		} //确保当前所用非0 
		for(int j=1;j<=m;j++){
			if(j!=i){
				LL s1=Ma.m[i][i]; 
				LL s2=Ma.m[j][i];
				if(s2==0) continue;
				else{
					LL g=gcd(s1,s2);
					Sub(j,s1/g,i,s2/g);
				}
			}
		}
	}
	if(Ma.con==0)
	for(int i=1;i<=m;i++){
		Ma.ans[i]=Ma.m[i][m+1]/Ma.m[i][i];
	}
}

void Gauss2() // 上三角矩阵 
{
}
void Read()
{
	scanf("%d",&m);
	
	//简单读入
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m+1;j++)
		scanf("%I64d",&Ma.m[i][j]);
	}
	
	Ma.con=0;
}
void Ans()
{
	for(int i=1;i<=m;i++){
		printf("%I64d\n",Ma.ans[i]);
	}
}
int main()
{
	Read();//矩阵读入 
	Gauss1();
	Ans();
	
	return 0;
}
实数

#include
#include
#include
using namespace std;

#define LL long long
#define Len 105
#define zero 0.0000001
//从1开始。不使用0位置。 


struct Martix
{
	double m[Len][Len];
	double ans[Len]; //最终解
	int con; // 0 表示唯一解 1 表示多解 2 表示无解 
}Ma;
int m;//矩阵长 

//矩阵操作 
void Mul(int a,double p) //第 x 行 同乘 p 
{
	for(int i=1;i<=m+1;i++)
	Ma.m[a][i]*=p;
}
void Sub(int a,double x,int b,double y) //第 a 行 的 x 倍 减去 b 行 的 y 倍 
{
	for(int i=1;i<=m+1;i++){
		Ma.m[a][i]=Ma.m[a][i]*x-Ma.m[b][i]*y;
	}
}
void exch(int a,int b) // 交换 a,b 两行
{
	for(int i=1;i<=m+1;i++){
		double temp=Ma.m[a][i];
		Ma.m[a][i]=Ma.m[b][i];
		Ma.m[b][i]=temp;
	} 
}  
// 
void Gauss1()  // m 阶矩阵 标准矩阵 
{
	
	for(int i=1;i<=m;i++){
		if(fabs(Ma.m[i][i])<=zero){
			for(int j=i+1;j<=m;j++){
				if(fabs(Ma.m[j][i])>zero){
					exch(i,j);
				}
			}
			if(fabs(Ma.m[i][i])<=zero){
				Ma.con=1;
				continue;
			}
		} //确保当前所用非0 
		for(int j=1;j<=m;j++){
			if(j!=i){
				double s1=Ma.m[i][i]; 
				double s2=Ma.m[j][i];
				if(fabs(s2)<=zero) continue;
				else{
					Sub(j,s1,i,s2);
				}
			}
		}
	}
	if(Ma.con==0)
	for(int i=1;i<=m;i++){
		Ma.ans[i]=Ma.m[i][m+1]/Ma.m[i][i];
	}
}

void Gauss2() // 上三角矩阵 
{
}
void Read()
{
	scanf("%d",&m);
	
	//简单读入
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m+1;j++)
		scanf("%lf",&Ma.m[i][j]);
	}
	
	Ma.con=0;
}
void Ans()
{
	for(int i=1;i<=m;i++){
		printf("%lf\n",Ma.ans[i]);
	}
}
int main()
{
	Read();//矩阵读入 
	Gauss1();
	Ans();
	
	return 0;
}
异或

#include
#include
using namespace std;

#define LL long long
#define Len 105

//从1开始。不使用0位置。 

/*
异或方程组:
a1 x1 ^ a2 x2 ^ a3 x3 = v1
b1 x1 ^ b2 x2 ^ b3 x3 = v2
c1 x1 ^ c2 x2 ^ c3 x3 = v3
其中 所有数 均为 0 1
x未知
其余已知 
*/ 
struct Martix
{
	bool m[Len][Len];
	bool ans[Len]; //最终解
	int con; // 0 表示唯一解 1 表示多解 2 表示无解 
}Ma;
int m;//矩阵长 

//矩阵操作 
void Mul(int a) //第 a 行 同 ^ 1
{
	for(int i=1;i<=m+1;i++)
	Ma.m[a][i]^=1;
}
void Sub(int a,int b) //第 a 行 异或 第 b 行 
{
	for(int i=1;i<=m+1;i++){
		Ma.m[a][i]=Ma.m[a][i]^Ma.m[b][i];
	}
}
void exch(int a,int b) // 交换 a,b 两行
{
	for(int i=1;i<=m+1;i++){
		Ma.m[a][i]^=Ma.m[b][i];
		Ma.m[b][i]^=Ma.m[a][i];
		Ma.m[a][i]^=Ma.m[b][i];
	} 
}  
// 
void Gauss1()  // m 阶矩阵 标准矩阵 
{
	
	for(int i=1;i<=m;i++){
		if(Ma.m[i][i]==0){
			for(int j=i+1;j<=m;j++){
				if(Ma.m[j][i]){
					exch(i,j);
				}
			}
			if(Ma.m[i][i]==0){
				Ma.con=1;
				continue;
			}
		} //确保当前所用非0 
		for(int j=1;j<=m;j++){
			if(j!=i){
				LL s1=Ma.m[i][i]; 
				LL s2=Ma.m[j][i];
				if(s2==0) continue;
				else{
					Sub(j,i);
				}
			}
		}
	}
	if(Ma.con==0)
	for(int i=1;i<=m;i++){
		Ma.ans[i]=Ma.m[i][m+1]^Ma.m[i][i];
	}
}

void Gauss2() // 上三角矩阵 
{
}
void Read()
{
	scanf("%d",&m);
	
	//简单读入
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m+1;j++)
		scanf("%d",&Ma.m[i][j]);
	}
	
	Ma.con=0;
}
void Ans()
{
	for(int i=1;i<=m;i++){
		printf("%d\n",Ma.ans[i]);
	}
}
int main()
{
	Read();//矩阵读入 
	Gauss1();
	Ans();
	
	return 0;
}


BY undersky

你可能感兴趣的:(高斯消元(整数型)模板 && 高斯消元(实数型)模板 && 高斯消元(异或型))