Gauss 消元(模板)
/*
title:Gauss消元整数解/小数解整数矩阵模板
author:lhk
time: 2016.9.11
没学vim的菜鸡自己手打了
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define clr(x) memset(x,0,sizeof(x))
#define clrdown(x) memset(x,-1,sizeof(x))
#define maxn 910
#define maxm 910
#define mod 3
using namespace std;
int A[maxn][maxm];//Gauss消元的增广矩阵
int free_x[maxm];//自由变元的位置
int x[maxm];//整数解集
double xd[maxm];//小数解集
void init(int n,int m);//矩阵初始化操作
int gauss(int n,int m);//gauss消元部分
void print(int n);//输出解集
int exgcd(int a,int b,int &x,int &y);//扩展欧几里得求逆元,对于模mod的矩阵除法需要
int lcm(int a,int b);
int gcd(int a,int b);
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init(n,m);
int p=gauss(n,m);
if(p==-)
{
printf("no answer\n");
return ;
}
if(p==-)
{
printf("have float answer\n");
return ;
}
printf("the num of free_x is %d\n",p);
print(m);
}
return ;
}
//输出解的和,自由变元数量以及各个解
void print(int n)
{
// 若有小数解换为xd输出
int sum=;
for(int i=;i<n;i++)
sum+=x[i];
printf("sum=%d\n",sum);
for(int i=;i<n;i++)
printf("x%d=%d\n",i+,x[i]);
return ;
}
//读入增广矩阵
void init(int n,int m)
{
clr(A);
for(int i=;i<n;i++)
for(int j=;j<=m;j++)
scanf("%d",&A[i][j]);
clrdown(x);
clr(free_x);
return ;
}
int gauss(int n,int m)//输出-1是无解,-2是有小数解,>=0则是自由变元的数量和全为整数解
{
int k,col,num=,max_r,dou,max_x,LCM,ta,tb;
//k为当前操作行,col为操作主元素所在列
for(k=,col=;k<n && col<m;k++,col++)
{
//若A[K][col]不为col列最大,则将k行与k+1到n-1行中A[i][col]绝对值最大的行交换
max_r=k;
max_x=abs(A[k][col]);
for(int i=k+;i<n;i++)
if(max_x<abs(A[i][col]))
{
max_x=abs(A[i][col]);
max_r=i;
}
if(max_r!=k)
{
for(int j=col;j<=m;j++)
swap(A[k][j],A[max_r][j]);
}
//若k到n-1行A[i][col]全为0,则主元素指向当前行下一列的元素
if(A[k][col]==)
{
k--;
free_x[num++]=col;
//自由变元为当前col
continue;
}
for(int i=k+;i<n;i++)
if(A[i][col])
{
LCM=lcm(abs(A[k][col]),abs(A[i][col]));
ta=LCM/abs(A[i][col]);
tb=LCM/abs(A[k][col]);
if(A[k][col]*A[i][col]<) tb=-tb;//若符号不同则取反
for(int j=col;j<=m;j++)
{
A[i][j]=A[i][j]*ta-A[k][j]*tb;
// A[i][j]=((A[i][j]*ta-A[k][j]*tb)%mod+mod)%mod; //模mod矩阵的消元
}
}
}
//k行及之后若有(0,0,0……,0,a)(a!=0)的行,则无解输出-1
for(int i=k;i<n;i++)
if(A[i][col]!=)
return -;
int temp;
//对自由变元的赋值,可有多种方式
//若为小数解则换为xd;
for(int i=;i<num;i++)
x[free_x[i]]=;
//int xi,yi; exgcd需要
for(int i=k-,c=m-;i>=;c=m-,i--)
{
temp=A[i][m];
while(x[c]!=-)
{
if(A[i][c])
temp-=x[c]*A[i][c];
//temp=((temp-(x[c]*A[i][c])%mod)%mod+mod)%mod;//模mod矩阵的回代
c--;
}
if(temp%A[i][c]!=) return -;
x[c]=temp/A[i][c];
/*exgcd(A[i][c],mod,xi,yi);
xi=(xi%mod+mod)%mod;
x[c]=(temp*xi%mod+mod)%mod;*/ //模mod 矩阵的x[i]的赋值
}
return col-k;
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;
y=;
return a;
}
else
{
int r=exgcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
}
int gcd(int a,int b)
{
int c;
while(b!=)
{
c=a%b;
a=b;
b=c;
}
return a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
Educational Codeforces Round 63 (Rated for Div. 2) F
https://codeforces.com/contest/1155/problem/F
#include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define cpy(x,y) memcpy(y,x,sizeof(x))
#define INF 0x3f3f3f3f
#define LL long long
#define fi first
#define se second
#define pb push_back
using namespace std;
const LL mod = ;
const int N =2e2+;
LL A[N][N];
LL a[N];
LL MOD(LL x){
return (x%mod+mod)%mod;
}
LL qpow(LL x,LL n){
LL res = ;
for(;n;n>>=,x = MOD(x*x))
if(n&) res = MOD(res*x);
return res;
}
int gauss(int n){
LL d;
int col = n;
bool flag;
for(int i=;i<n;i++){
if(A[i][i] == ){
flag = ;
for(int j=i+;j<n;j++){
if(A[j][i] != ){
for(int k=i;k<=n;k++)
swap(A[j][k],A[i][k]);
flag = ;
break;
}
}
if(!flag){
col--;
continue;
}
}
d = qpow(A[i][i],mod-);
for(int j=i;j<=n;j++) A[i][j] = MOD(A[i][j] * d);
for(int j=;j<n;j++){
if(i!=j){
d = A[j][i];
for(int k=i;k<=n;k++){
A[j][k] = MOD(A[j][k] - MOD(d * A[i][k]));
}
}
}
}
return col;
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
LL x;
LL d;
for(int i=;i<=;i++){
cout<<"? "<<i<<endl;
fflush(stdout);
cin>>x;
for(int j=;j<=;j++)
A[i][j] = qpow(i,j);
A[i][] = x;
}
gauss();
for(int i=;i<=;i++)
a[i] = A[i][];
LL ans = -;
for(int i=;i<mod;i++)
{
x = ;
for(int j = ;j>=;j--)
x = MOD(MOD(x * i) + a[j]);
if(x == )
ans = i;
}
cout<<"! "<<ans<<endl;
}
Gauss 消元(模板)的更多相关文章
- Gauss消元模板
; //高斯消元模板 //----------------------------------------------------------------------------------- //把 ...
- POJ 1830 开关问题(Gauss 消元)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7726 Accepted: 3032 Description ...
- $Gauss$消元
$Gauss$消元 今天金牌爷来问我一个高消的题目,我才想起来忘了学高消... 高斯消元用于解线性方程组,也就是形如: $\left\{\begin{matrix}a_{11}x_1+a_{12}x_ ...
- 高斯消元模板!!!bzoj1013
/* 高斯消元模板题 n维球体确定圆心必须要用到n+1个点 设圆心坐标(x1,x2,x3,x4...xn),半径为C 设第i个点坐标为(ai1,ai2,ai3,,,ain)那么对应的方程为 (x1-a ...
- 求一个n元一次方程的解,Gauss消元
求一个n元一次方程的解,Gauss消元 const Matrix=require('./Matrix.js') /*Gauss 消元 传入一个矩阵,传出结果 */ function Gauss(mat ...
- hdu 5755(Gauss 消元) &poj 2947
Gambler Bo Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- poj 1681(Gauss 消元)
Painter's Problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5875 Accepted: 2825 ...
- HDU 3359 高斯消元模板题,
http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...
- POJ1830开关问题——gauss消元
题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...
随机推荐
- Super A^B mod C (快速幂+欧拉函数+欧拉定理)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...
- bzoj 3524 可持久化线段树
我们可以先离散化,然后建立权值的可持久化线段树,记录每个数出现的次数,对于区间询问直接判断左右儿子的cnt是不是大于(r-k+1)/2,然后递归到最后一层要是还是大于就有,否则不存在. 反思:挺简单一 ...
- 深入理解 JavaScript(五)
根本没有“JSON 对象”这回事! 前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为 JSON 对象,把 JSON 对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下 ...
- SpringBoot工程目录配置
Spring Boot建议的目录结果如下: root package结构:com.example.myproject com +- example +- myproject +- Applicat ...
- 基于ansj_seg和nlp-lang的简单nlp工具类
1.首先在pom中引入ansj_seg和nlp-lang的依赖包, ansj_seg包的作用: 这是一个基于n-Gram+CRF+HMM的中文分词的java实现: 分词速度达到每秒钟大约200万字左右 ...
- Coursera助学金申请模板
讲真,我觉得coursera的课还挺贵的.但是它有助学金系统,非常对我们穷学生友好了,而且基本上申请的都会批.不过现在助学金需要15个工作日才有答复,所以注意要提前申请. 有两大段要填. 虽然写的挺烂 ...
- win10远程桌面配置
Win10连接远程桌面的时候提示您的凭证不工作该怎么办? http://www.cnblogs.com/zhuimengle/p/6048128.html 二.服务器端 1.依旧进入组策略,不过是在服 ...
- 【bzoj3786】星系探索
ETT模版题. 真正的Eular-Tour-Tree维护的是树的欧拉序. 由于各种原因,没人知道怎么维护欧拉序,所以我写的是个假的,维护dfs序的. 本质还是用Splay维护序列. 然后因为我常数太差 ...
- Pretrained models for Pytorch (Work in progress)
The goal of this repo is: to help to reproduce research papers results (transfer learning setups for ...
- plus.networkinfo.getCurrentType()
HTML5+API device Device Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 对象: ...