题目链接:https://vjudge.net/problem/POJ-2947

题意:转换题意后就是已知m个同余方程,求n个变量。

思路:

  值得学习的是这个模板里消元用到lcm的那一块。注意题目输出的答案在[3,9]之间。

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std; const int maxn=;
int n,m,a[maxn][maxn],x[maxn];
char s1[],s2[]; int gcd(int a,int b){
return b?gcd(b,a%b):a;
} int lcm(int a,int b){
return a/gcd(a,b)*b; //先除后乘
} // 高斯消元法解方程组(Gauss-Jordan elimination).(
//-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
//有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.
int Gauss(int equ,int var){
int k,max_r,col=,ta,tb,LCM,temp;
for(int i=;i<var;++i){
x[i]=;
}
for(k=;k<equ&&col<var;++k,++col){
max_r=k;
//找系数绝对值最大的那一行与第k行交换
for(int i=k+;i<equ;++i){
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
}
if(max_r!=k){
for(int i=col;i<var+;++i)
swap(a[max_r][i],a[k][i]);
}
if(!a[k][col]){
--k;
continue;
}
for(int i=k+;i<equ;++i){
if(!a[i][col]) continue;
LCM=lcm(abs(a[i][col]),abs(a[k][col]));
ta=LCM/abs(a[i][col]);
tb=LCM/abs(a[k][col]);
if(a[i][col]*a[k][col]<) tb=-tb; //异号的情况是相加
for(int j=col;j<var+;++j){
a[i][j]=((a[i][j]*ta-a[k][j]*tb)%+)%;
}
}
}
//无解的情况
for(int i=k;i<equ;++i){
if(a[i][col]) return -;
}
//无穷解的情况
if(k<var){
return var-k; //返回自由变元的个数
}
//唯一解的情况,增广矩阵中形成严格的上三角阵
for(int i=var-;i>=;--i){
temp=a[i][var];
for(int j=i+;j<var;++j){
if(!a[i][j]) continue;
temp-=a[i][j]*x[j];
temp=(temp%+)%;
}
while(temp%a[i][i]!=) temp+=;
x[i]=(temp/a[i][i])%;
}
return ;
} int tran(char *s){
if(strcmp(s,"MON")==) return ;
else if(strcmp(s,"TUE")==) return ;
else if(strcmp(s,"WED")==) return ;
else if(strcmp(s,"THU")==) return ;
else if(strcmp(s,"FRI")==) return ;
else if(strcmp(s,"SAT")==) return ;
else return ;
} int main(){
while(scanf("%d%d",&n,&m),n||m){
memset(a,,sizeof(a));
for(int i=;i<m;++i){
int k;
scanf("%d%s%s",&k,s1,s2);
a[i][n]=((tran(s2)-tran(s1)+)%+)%;
while(k--){
int t;
scanf("%d",&t);
--t;
++a[i][t];
a[i][t]%=;
}
}
int ans=Gauss(m,n);
if(ans==){
for(int i=;i<n;++i)
if(x[i]<=) x[i]+=;
for(int i=;i<n-;++i)
printf("%d ",x[i]);
printf("%d\n",x[n-]);
}
else if(ans==-){
printf("Inconsistent data.\n");
}
else{
printf("Multiple solutions.\n");
}
}
return ;
}

(模板)poj2947(高斯消元法解同余方程组)的更多相关文章

  1. poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2065 题意:题目看着较复杂,实际上就是给了n个同余方程,解n个未知数. 思路:套高斯消元法的模板即可. AC代码: #inc ...

  2. hdu 5755 Gambler Bo (高斯消元法解同余方程组)

    http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意: n*m矩阵,每个格有数字0/1/2 每选择一个格子,这个格子+2,4方向相邻格子+1 如何选择格子 ...

  3. C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)

    拓展中国剩余定理 前言 记得半年前还写过关于拓展中国剩余定理的博客...不过那时对其理解还不是比较深刻,写的也比较乱. 于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT) 记得半年 ...

  4. poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

    http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...

  5. HDU1573:X问题(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题 ...

  6. HDU3579:Hello Kiki(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...

  7. 洛谷——P3389 【模板】高斯消元法

    P3389 [模板]高斯消元法 以下内容都可省略,直接转大佬博客%%% 高斯消元总结 只会背板子的蒟蒻,高斯消元是什么,不知道诶,看到大佬们都会了这个水题,蒟蒻只好也来切一切 高斯消元最大用途就是解多 ...

  8. 洛谷P3389 【模板】高斯消元法

    P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1​,a ...

  9. 「LuoguP3389」【模板】高斯消元法

    题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdot ...

随机推荐

  1. P4461 [CQOI2018]九连环

    思路:\(DP\) 提交:\(2\)次 错因:高精写挂(窝太菜了) 题解: 观察可知\(f[i]=2*f[i-1]+(n\&1)\) 高精的过程参考了WinXP@luogu的思路: 发现一个问 ...

  2. 彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题

    彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题 2018年12月08日 21:58:26 Kevin395 阅读数 1753   背景不多介绍了,直接上代码. ...

  3. linux系统编程--线程同步

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对“同步”的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步,是指让两个或多个数据库内容保持一致,或者按需 ...

  4. K8S中Pods

    什么是Pod 一个Pod(就像一群鲸鱼,或者一个豌豆夹)相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机 ...

  5. cyk追楠神系列一(SDUT3703)

    cyk追楠神系列一 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 众所周知,cyk ...

  6. pandas入门之DataFrame

    创建DataFrame - DataFrame是一个[表格型]的数据结构.DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行 ...

  7. MySQL二进制包安装

    mysql的安装有多种方法,这里就介绍一下二进制包安装. [root@node1 ~]# tar xvf mysql-5.7.27-linux-glibc2.12-x86_64.tar [root@n ...

  8. pwn学习日记Day19 《程序员的自我修养》读书笔记

    windows PE/COFF章总结 本章学习了windows下的可执行文件和目标文件格式PE/COFF.PE/COFF文件与ELF文件非常相似,它们都是基于段的结构的二进制文件格式.Windows下 ...

  9. Java操作Cookie方法

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  10. docker 容器连接 host的sql server失败

    报错内容::“A network-related or instance-specific error occurred while establishing a connection to SQL ...