`
xitonga
  • 浏览: 585897 次
文章分类
社区版块
存档分类
最新评论

高斯消元模板

 
阅读更多
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
#define CL(a,b) memset(a,b,sizeof(a))
#define INF 100000000
const int M(300);
int a[M][M];//方程
int free_x[M],num;//自由变元下标及个数
int x[M];//解
inline int gcd(int n,int m)
{
	if(m==0)
		return n;
	return gcd(m,n%m);
}
inline int LCM(int n,int m)
{
	return n*m/gcd(n,m);
}
int gauss(int equ,int var,int p)
{
	int i,j,k,col;
	int max_r;
	num=0;
	CL(free_x,0);
	CL(x,0);
	for(k=0,col=0;k<equ&&col<var;k++,col++)
	{
		max_r=k;
		for(i=k+1;i<equ;i++)
			if(a[i][col]>a[max_r][col])
				max_r=i;
		if(a[max_r][col]==0)
		{
			k--;
			free_x[num++]=col;
			continue;
		}
		if(k!=max_r)
			for(i=0;i<var+1;i++)
				swap(a[k][i],a[max_r][i]);
		for(i=k+1;i<equ;i++)
		{
			if(a[i][col]!=0)
			{
				int lcm,ta,tb;
				lcm=LCM(abs(a[k][col]),abs(a[i][col]));
				ta=lcm/abs(a[i][col]);
				tb=lcm/abs(a[k][col]);
				if(a[i][col]*a[k][col]<0)
				tb=-tb;
				for(j=col;j<var+1;j++)
				{
					a[i][j]=((a[i][j]*ta-a[k][j]*tb)%p+p)%p;
				}
			}
		}
		
	
	}
	
	//debug
	/*		
	printf("\n");
	for(i=0;i<equ;i++)
		{
			for(j=0;j<var+1;j++)
				printf("%d ",a[i][j]);
			printf("\n");
		}*/
	for(i=k;i<equ;i++)//(0,0,0,...,a)是否存在此种无解情况
	{
		if(a[i][col]!=0)
			return -1;
	}
	//printf("%d\n",num);
        
//var-k 自由变量的个数
	int s=(1<<(var-k)),index,cnt=0,l,ret=INF;
	// 枚举自由变量的状态,来确定解,此处为 mod 2 方程,
	
	/*for(i=0;i<s;i++)
	{
		index=i;cnt=0;
		CL(x,0);
		for(j=0;j<var-k;j++)
		{
			x[free_x[j]]=(index&1);
			if(x[free_x[j]])
				cnt++;
			index>>=1;
		}
		for(j=k-1;j>=0;j--)
		{
			int tmp=a[j][var];
			for(l=j+1;l<var;l++)
			{
				if(a[j][l])
					tmp ^= x[l] ;
			}
			x[j] = tmp ;
			if(x[j])
				cnt++;
		}
	//	printf("%d\n",cnt);
		if(ret>cnt)
			ret=cnt;
	}
	return ret;*/
	if(k<var)
		return var-k;
	for(i=var-1;i>=0;i--)
	{
		int tmp=a[i][var];
		for(j=i+1;j<var;j++)
			tmp=((tmp-a[i][j]*x[j])%p+p)%p;
		while(tmp%a[i][i]!=0)
			tmp+=p;
		x[i]=tmp/a[i][i];
	}
	return 0;

}
int main()
{
	int t,n,i,j,m,p;
	scanf("%d%d",&n,&m);
		
	/*	for(i=0;i<n*n;i++)
		{
			for(j=0;j<n*n+1;j++)
				printf("%d ",a[i][j]);
			printf("\n");
		}*/
	int k=gauss(n,m,p);//n个方程,m个变量 mod p 的方程
	if(k==-1)
		printf("无解\n");
	else if(k>0)	
		printf("无穷解\n");
	else
	{
		for(i=0;i<m;i++)
			printf("%d\n",x[i]);
	}
}

分享到:
评论

相关推荐

    ACM/ICPC常用模版

    包括了几何、数论、图论、数值计算等常用模版,可以直接套用,非常方便

    高斯消法元解方程组模板

    高斯消元解方程组。 解多元一次方程组。 注释详细

    ACM/ICPC模板

    ACM/ICPC模板 内容大概有这些 其他 --高精度模板 ...--高斯消元(用bigInteger和分数类 ,Java实现) //thanks to love8909 --矩阵运算 --欧拉函数 --初等数论(模线性方程组,gcd相关等) --素数判断

    南阳理工acm常用模板

    高斯消元

    建议收藏算法基础课模板大全

    基础算法 —— 代码模板链接 常用代码模板1——基础算法 排序 ...高斯消元 组合计数 容斥原理 简单博弈论 动态规划 背包问题 线性DP 区间DP 计数类DP 数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心

    AcWing算法基础课模板大全

    基础算法 —— 代码模板链接 常用代码模板1——基础算法 排序 ...高斯消元 组合计数 容斥原理 简单博弈论 动态规划 背包问题 线性DP 区间DP 计数类DP 数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心

    leetcode中国-leetcode_algo:leetcode相关算法和模板使用python

    高斯消元 组合计数 容斥原理 简单博弈论 动态规划 背包问题 线性DP 区间DP 计数类DP 数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心 时空复杂度分析 提高知识点 动态规划——从集合角度考虑DP问题 1.1 数字三角形...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    3.7 高斯消元回代法 122 3.8 数值计算 124 3.8.1 定积分计算 124 3.8.2 多项式求根(牛顿法) 125 3.8.3 周期性方程(追赶法) 127 4.排序 128 4.1快速选择算法 128 4.2归并排序+逆序数的求取 128 5.字符串 130 5.1 KMP...

    ACM模板(几乎全)

    1 图论 3 1.1 术语 3 1.2 独立集、覆盖集、支配集之间关系 3 1.3 DFS 4 1.3.1 割顶 6 1.3.2 桥 7 1.3.3 强连通分量 7 1.4 最小点基 7 1.5 拓扑排序 7 1.6 欧拉路 8 1.7 哈密顿路(正确?...7.5 高斯消元 75 8 其它 77

    acm模板(全)

    1 图论 3 1.1 术语 3 1.2 独立集、覆盖集、支配集之间关系 3 1.3 DFS 4 1.3.1 割顶 6 1.3.2 桥 7 1.3.3 强连通分量 7 1.4 最小点基 7 1.5 拓扑排序 7 1.6 欧拉路 8 1.7 哈密顿路(正确?...7.5 高斯消元 75 8 其它 77

    ACM巨全模板 .pdf

    16.高斯消元 17.矩阵快速幂 18.分解质因数 19.线性递推式BM(杜教) 20.线性一次方程组解的情况 21.求解行列式的逆矩阵,伴随矩阵,矩阵不全随机数不全 组合数学: 1.循环排列 (与环有关的排列组合) 计算几何: 1....

    【模板】矩阵求逆(矩阵初等变换)

    对每一行来一波高斯消元 O(n3)O(n^3)O(n3) 做法: 首先介绍矩阵的初等变换(以下为初等行变换): 交换两行,记做 ri:left-right_arrow:rjr_i\leftrightarrow r_jri​:left-right_arrow:rj​ 将一行的所有元乘上数

    kuangbin acm模板超级好用

    2.8 高斯消元(浮点数) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.9 FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.10 高斯消元...

    数值分析:课件+试题等-6名校课件合集-数值分析程序

    元元素消元.C 龙贝格算法.c 分段线性插值.c 复合梯形法.c 复合辛普森.c 改进欧拉法.C 高斯消去法.c 埃特肯.c 二分法.c 显示方法.c 杜氏分解 法.C 1.湖南师范大学《数值分析》课件 2.华中科技大学《数值分析》课件 3...

Global site tag (gtag.js) - Google Analytics