中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)
0.引子
每一个讲中国剩余定理的人,都会从孙子的一道例题讲起
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
1.中国剩余定理
引子里的例题实际上是求一个最小的x满足
关键是,其中r1,r2,……,rk互质
这种问题都有多解,每一个解都为最小的解加上若干个lcm(r1,r2,...,rk),这个不用我证了吧(-_-||)
解决这个问题的方法是构造法,
先构造k个数
满足,
这样就保证 ,但是由于 bi 乘了除 ri 以外所有 r,所以bi模其它的 r 都为 0,
再把所有 bi 加起来,得到的数就满足方程了。
例题
UVA756 Biorhythms
HDU1370 Biorhythms
非常裸的一道剩余定理的题,但是某些OJ题面出了问题,以至于让同学们白白wa了很多遍
首先是luogu的翻译,并不是“保证 x 不超过 21252”,而是“保证 x-d 不超过 21252”
然后是(屑)HDU的数据,一开始得输入一个数后才能开始输入,看样例应该就知道了
题目把r1~r3都给出来了,相当于可以直接手算得出
直接代入算b
最后判断x是否<=d,是就+=21252
CODE
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x)&(x))
//#define int LL
using namespace std;
inline LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + (s - '0');s = getchar();}
return x * f;
}
int main() {
// read(); //HDU的把这句加上
int p,e,i,d,lc = 21252,ad1 = 5544,ad2 = 14421,ad3 = 1288;
int Case = 0;
while(scanf("%d%d%d%d",&p,&e,&i,&d) == 4) {
if(p == -1 || e == -1 || i == -1 || d == -1) break;
int x = (p *1ll* ad1 + e *1ll* ad2 + i *1ll* ad3) % lc;
if(x <= d) x += lc;
printf("Case %d: the next triple peak occurs in %d days.\n",++ Case,x - d);
}
return 0;
}
2.扩展中国剩余定理
这个就比普通中国剩余定理好用多了
还是求这个方程
但是不保证互质了
既然不保证互质,他们就有最大公约数
我们依次合并两个方程
把它变一下,设k、p,满足
即
移个项:
于是它就变成了“ax+by=c”的形式,可以用扩展欧几里得求出特解k(若无解就整个方程无解了)
它的任意解都满足
由于x等于通解中的一个,
所以
成功合并成一个方程!
最后剩下一个方程时,最小的解就为式子右边的值
例题
POJ2891 Strange Way to Express Integers
这题是扩展中国剩余定理的板题,不用我讲了吧(众所周知,板题≠水题)
CODE
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#define MAXN 2000005
#define MAXM 3000005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x)&(x))
#define int LL
using namespace std;
inline LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + (s - '0');s = getchar();}
return x * f;
}
const int jzm = 1000000007;
int n,m,i,j,s,o,k;
LL exgcd(LL a,LL b,LL &x,LL &y) {
if(b == 0) {
x = 1;y = 0;
return a;
}
LL r = exgcd(b,a%b,y,x);
y -= x*(a/b);
return r;
}
signed main() {
while(scanf("%lld",&n) == 1) {
LL r1 = read(),a1 = read();
bool flag = 1;
for(int i = 2;i <= n;i ++) {
LL r2 = read(),a2 = read(),k,p;
if(a2 > a1) swap(a1,a2),swap(r1,r2);
if(!flag) continue;
LL gc = exgcd(r1,r2,k,p),lc = r1 / gc * r2;
if((a1-a2) % gc) {
flag = 0;continue;
}
LL tym = r2/gc;
((k = (k * (a1-a2) / gc) % tym) += tym) %= tym;
a1 = (a1 + lc - k * r1 % lc) % lc;
r1 = lc;
}
if(!flag) printf("-1\n");
else printf("%lld\n",a1 == 0 ? r1:a1);
}
return 0;
}
中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)的更多相关文章
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- [poj2891]Strange Way to Express Integers(扩展中国剩余定理)
题意:求解一般模线性同余方程组 解题关键:扩展中国剩余定理求解.两两求解. $\left\{ {\begin{array}{*{20}{l}}{x = {r_1}\,\bmod \,{m_1}}\\{ ...
- POJ2891 Strange Way to Express Integers【扩展中国剩余定理】
题目大意 就是模板...没啥好说的 思路 因为模数不互质,所以直接中国剩余定理肯定是不对的 然后就考虑怎么合并两个同余方程 \(ans = a_1 + x_1 * m_1 = a_2 + x_2 * ...
- POJ2891 Strange Way to Express Integers [中国剩余定理]
不互质情况的模板题 注意多组数据不要一发现不合法就退出 #include <iostream> #include <cstdio> #include <cstring&g ...
- POJ-2891 Strange Way to Express Integers(拓展中国剩余定理)
放一个写的不错的博客:https://www.cnblogs.com/zwfymqz/p/8425731.html POJ好像不能用__int128. #include <iostream> ...
- POJ2891 Strange Way to Express Integers (扩展欧几里德)
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...
- POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...
- 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)
F - Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format: ...
- poj 2981 Strange Way to Express Integers (中国剩余定理不互质)
http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 13 ...
随机推荐
- ESP8266 系统环境搭建
1. 前言 因为ESP8266/ESP32这个开发环境没少折腾,是真没见过这么难搞又不清晰的环境. 简单开发可以使用Arduino IDE ,这个平台还是挺好的.开发使用Arduino的函数库,很高效 ...
- 我的 Java 学习&面试网站又又又升级了!
晚上好,我是 Guide. 距离上次介绍 JavaGuide 新版在线阅读网站已经过去 7 个多月了(相关阅读:官宣!我升级了!!!),这 7 个多月里不论是 JavaGuide 的内容,还是 Jav ...
- 『忘了再学』Shell流程控制 — 36、for循环介绍
目录 1.for循环介绍 2.示例 语法一举例: 语法二举例: 3.for循环总结 4.练习:批量解压缩脚本 方式一:批量解压缩 方式二:批量解压缩 1.for循环介绍 for循环是固定循环,也就是在 ...
- 基于web3D展示技术的煤矿巷道3D可视化系统
地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...
- BSS应用程序云原生部署的8大挑战
云原生部署改变了软件开发.根据云原生计算基金会(CNCF)2021年年度调查,96%的组织正在使用或评估Kubernetes.更确切地说,560万开发者在使用Kubernetes,比去年增加了67%. ...
- linux系统漏洞lynis扫描
1.下载lynis https://cisofy.com/downloads/lynis/ 或者 yum --enablerepo=epel -y install lynis 2. rz上传压缩包解压 ...
- Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b1938128a963
报错信息:Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait ...
- XXXX系统测试计划
XXXX系统测试计划 目录 XXXX系统测试计划 目标 概述 项目背景 适用范围 组织形式 组织架构图 角色及职责 测试工作分工 团队协作 测试对象 应测试特性 不被测试特性 测试任务安排 系统测试任 ...
- AspectJ和AOP细节
AspectJ1. 简介 AspectJ:Java社区里最完整最流行的AOP框架.(在Spring中AOP是一种思想,而AspectJ是一种AOP的更明确具体实现) 在Spring2.0以上版本中,可 ...
- List集合_介绍&常用方法和ArrayList集合
List集合 我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢? 接下来,我们一起学习Collection中的常用几个子类(java.util ...