/*
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. 关于EditText.setText()无法显示的问题

    将EditText在初始化后调用EditText.setSaveEnabled(false); 让Android 系统不保存值,这样就不会恢复了.

  2. CreateProcess中的部分参数理解

    函数原型,这里写Unicode版本 WINBASEAPIBOOLWINAPICreateProcessW( _In_opt_ LPCWSTR lpApplicationName, //可执行文件名字 ...

  3. 【swupdate文档 二】许可证

    许可证 SWUpdate是免费软件.它的版权属于Stefano Babic和其他许多贡献代码的人(详情请参阅实际源代码和git提交信息). 您可以根据自由软件基金会发布的GNU通用公共许可证第2版的条 ...

  4. Linux NAPI/非NAPI

    本文主要介绍二层收包流程,包括NAPI与非NAPI方式: NAPI:数据包到来,第一个数据包产生硬件中断,中断处理程序将设备的napi_struct结构挂在当前cpu的待收包设备链表softnet_d ...

  5. x64dbg

    https://x64dbg.com/ https://github.com/x64dbg/x64dbg https://sourceforge.net/projects/x64dbg/files/s ...

  6. tornado当用户输入的URL无效时转入设定的页面

    今天做web的测验..坑爹的要用tornado...作为一个比较新的用的人还不多的东东...查资料好麻烦.. 下面是当用户输入非法 url时, 显示一个自定义 404 页面提示用户,其访问的页面不存在 ...

  7. 2017多校第7场 HDU 6127 Hard challenge 极角排序,双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意:平面直角坐标系上有n个整点,第i个点有一个点权val​,坐标为(xi,yi),其中不存在任 ...

  8. Atom:优雅迷人的编辑神器

    对于热爱markdown写作的人来说,Atom同样是一款拥有无穷魅力的写作软件.我不怕它无法满足你的需求,就怕你不给一个机会了解它,那么,这将是一场遗憾的错过. 大学的时候,坊间对那些编程高手有一个令 ...

  9. python之路——面向对象进阶

    阅读目录 isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ __del__ item系列 __geti ...

  10. WordPress 前端投稿/编辑发表文章插件 DJD Site Post(支持游客和已注册用户)汉化版 免费下载

    插件简介 前面逍遥乐给大家推荐了 WordPress用户前端化专业版WP User Frontend Pro WordPress中文汉化插件v2.1.9 今天逍遥乐给大家带来的wordpress插件是 ...