/*
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 消元(模板)的更多相关文章

  1. Gauss消元模板

    ; //高斯消元模板 //----------------------------------------------------------------------------------- //把 ...

  2. POJ 1830 开关问题(Gauss 消元)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7726   Accepted: 3032 Description ...

  3. $Gauss$消元

    $Gauss$消元 今天金牌爷来问我一个高消的题目,我才想起来忘了学高消... 高斯消元用于解线性方程组,也就是形如: $\left\{\begin{matrix}a_{11}x_1+a_{12}x_ ...

  4. 高斯消元模板!!!bzoj1013

    /* 高斯消元模板题 n维球体确定圆心必须要用到n+1个点 设圆心坐标(x1,x2,x3,x4...xn),半径为C 设第i个点坐标为(ai1,ai2,ai3,,,ain)那么对应的方程为 (x1-a ...

  5. 求一个n元一次方程的解,Gauss消元

    求一个n元一次方程的解,Gauss消元 const Matrix=require('./Matrix.js') /*Gauss 消元 传入一个矩阵,传出结果 */ function Gauss(mat ...

  6. hdu 5755(Gauss 消元) &poj 2947

    Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  7. poj 1681(Gauss 消元)

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5875   Accepted: 2825 ...

  8. HDU 3359 高斯消元模板题,

    http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...

  9. POJ1830开关问题——gauss消元

    题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...

随机推荐

  1. python数据处理课程笔记(一)

    一.numpy 1.numpy中所有元素必须是相同的类型 a=[1,2,3,4,'t'] #列表中有str类型,转换为ndarray时所有元素都转换为str类型 arr1=np.array(a) pr ...

  2. 加overflow-hidden就可以解决高度塌陷问题,overflow-触发BFC

    1.BFC 全称是块级排版上下文,用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文,但是如果一个块级元素 设置了float:left,overflow:hidden或position ...

  3. JqGrid自定义(图片)列

    $("#gridTable").jqGrid({ //...其它属性 colModel: [ //...其它列 { name: , align: "center" ...

  4. 玩一下易语言 "和"字有多种读音,注定了它的重要性!!

    变量名 类型 静态 数组 备注 拼音 文本型   0   测试的汉字 文本型       有几种发音 整数型       i 整数型       测试用的汉字 = “和” 有几种发音 = 取发音数目 ...

  5. parseInt函数

    1.概念 解析字符串,返回一个整数 2.说明 接收两个参数:需要转化的字符串.需要解析的数字基数,介于2~36之间(若该值神略或为0,数字将以10为基数解析:若参数大于36或小于2则返回NaN) pa ...

  6. Linux进程调度与源码分析(一)——简介

    本系列文章主要是近期针对Linux进程调度源码进行阅读与分析后的经验总结,分析过程中可能结合部分Linux网络编程的相关知识以便于理解,加深对Linux进程调度的理解和知识分享. 本系列文章主要结合L ...

  7. 33.Search in Rotated Sorted Array---二分变形---《剑指offer》面试题8

    题目链接 题目大意:在一个旋转数组中,判断给定的target是否存在于该旋转数组中.数组中没有重复数值.例子如下: 法一:二分.确定中间元素之后,就要判断下一步是遍历左数组还是遍历右数组.如果左数组有 ...

  8. 动画基础--基于Core Animation(2)

    参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本 ...

  9. [New learn] 设计模式

    本文翻译自:http://www.raywenderlich.com/46988/ios-design-patterns iOS设计模式 - 你可能听到过这个术语,但是你知道是什么意思吗?虽然大多数的 ...

  10. 在Xcode中使用自定义的代码片段提高效率

    拖动代码的时候按住option键,很难拖,注意方法:< 引用于:http://www.2cto.com/kf/201409/336245.html