中国剩余定理+扩展中国剩余定理 讲解+例题(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 ...
随机推荐
- 入坑KeePass(二)重置keepass设置
保留好.kdbx和密钥文件,软件的文件可以删除掉,重新下载并解压设置就恢复默认了
- vue大型电商项目尚品汇(后台篇)day02
这几天更新有点小慢,逐渐开始回归状态了.尽快把这个后台做完,要开始vue3了 3.添加修改品牌 用到组件 Dialog 对话框,其中visible.sync这个配置是修改他的显示隐藏的,label-w ...
- 关于个人项目(臻美MV【仿抖音App】)滑动切换视频的分析(前端角度)
我们知道你天天刷抖音的时候可以上滑切换视频,互不影响.那么我们站在前端的角度能否可以实现这种效果呢?这是我的个人项目:臻美MV 下面我是用Vue写的,现在我把它开源. Vue: 初始界面 <te ...
- React与Koa一起打造一个仿稀土掘金全栈个人博客(技术篇)
本篇文章将分为前台角度与后台角度来分析我是怎么开发的.前台角度主要资源 react.js ant Design for-editor axios craco-less immutable react- ...
- React技巧之字符串插值
原文链接:https://bobbyhadz.com/blog/react-string-interpolation 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中,使 ...
- CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构
很高兴你能在浮躁的年代里还有兴趣阅读源代码,CesiumJS 至今已有十年以上,代码量也积累了三十多万行(未压缩状态). 我也很荣幸自己的文章能被读者看到,如果对你有帮助.有启发,点个赞就是对我最大的 ...
- Training a classifier
你已经学习了如何定义神经网络,计算损失和执行网络权重的更新. 现在你或许在思考. What about data? 通常当你需要处理图像,文本,音频,视频数据,你能够使用标准的python包将数据加载 ...
- Linux操作系统(7):rpm包管理和yum软件包在线管理
一.rpm 包的管理 介绍:一种用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中.它生成具有.RPM 扩展名的文件.RPM 是 RedHat Package Manager(Red ...
- 如何学习Vim
如果你是Linux用户,学习Vim会有很大的好处. 如果你是windows用户,个人建议还是使用vscode. 准备大约40min的学习时间,打开终端,输入下面命令开启自带教程 vimtutor 按操 ...
- FPS游戏逆向-方框透视(三角函数)
本套课程主要学习FPS类游戏安全 由于FPS类游戏本身的特性问题,可能产生一些通用的游戏安全问题 在通过逆向与正向对FPS类游戏分析之后,找到其可能出现的不安全点 才能更好的保护游戏不被外部力量侵犯 ...