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)的更多相关文章

  1. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  2. [poj2891]Strange Way to Express Integers(扩展中国剩余定理)

    题意:求解一般模线性同余方程组 解题关键:扩展中国剩余定理求解.两两求解. $\left\{ {\begin{array}{*{20}{l}}{x = {r_1}\,\bmod \,{m_1}}\\{ ...

  3. POJ2891 Strange Way to Express Integers【扩展中国剩余定理】

    题目大意 就是模板...没啥好说的 思路 因为模数不互质,所以直接中国剩余定理肯定是不对的 然后就考虑怎么合并两个同余方程 \(ans = a_1 + x_1 * m_1 = a_2 + x_2 * ...

  4. POJ2891 Strange Way to Express Integers [中国剩余定理]

    不互质情况的模板题 注意多组数据不要一发现不合法就退出 #include <iostream> #include <cstdio> #include <cstring&g ...

  5. POJ-2891 Strange Way to Express Integers(拓展中国剩余定理)

    放一个写的不错的博客:https://www.cnblogs.com/zwfymqz/p/8425731.html POJ好像不能用__int128. #include <iostream> ...

  6. POJ2891 Strange Way to Express Integers (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...

  7. POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...

  8. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  9. poj 2981 Strange Way to Express Integers (中国剩余定理不互质)

    http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 13 ...

随机推荐

  1. c++ FHQ Treap

    前面我们对平衡树有了个大概的了解 关于 Treap Treap=Binary Search Tree + Heap 二叉搜索树 + 二叉堆(一般是小根堆) Treap 每一个节点有两个值 一个值是平衡 ...

  2. 攻防世界pwn题:实时数据检测

    0x00:查看文件 一个32位的文件,canary.NX.PIE保护机制均关闭. 0x01:用IDA进行静态分析 程序很简单,输入一串字符(个数限制:512),然后再输出.最后根据key变量进行条件语 ...

  3. 循环码、卷积码及其python实现

    摘要:本文介绍了循环码和卷积码两种编码方式,并且,作者给出了两种编码方式的编码译码的python实现 关键字:循环码,系统编码,卷积码,python,Viterbi算法 循环码的编码译码 设 \(C\ ...

  4. BSS应用程序云原生部署的8大挑战

    云原生部署改变了软件开发.根据云原生计算基金会(CNCF)2021年年度调查,96%的组织正在使用或评估Kubernetes.更确切地说,560万开发者在使用Kubernetes,比去年增加了67%. ...

  5. SAP Web Dynpro - 个性化和配置

    根据业务需求,您可以实现许多标准应用程序,并且Web Dynpro应用程序的UI可以根据要求而有所不同. 应用配置 要配置Web Dynpro应用程序,首先要为单个Web Dynpro组件配置数据记录 ...

  6. 分享自己平时使用的socket多客户端通信的代码技术点和软件使用

    前言 说到linux下多进程通信,有好几种,之前也在喵哥的公众号回复过,这里再拿出来,重新写一遍:多进程通信有管道,而管道分为匿名和命名管道 ,后者比前者优势在于可以进行无亲缘进程通信:此外信号也是进 ...

  7. RPA应用场景-定点取数

    场景概述定点取数 所涉系统名称业务系统,Excel 人工操作(时间/次) 8 小时 所涉人工数量 2 操作频率实时 场景流程 1.从业务系统中拉取指定字段值的数据填入Excel: 2.将Excel每隔 ...

  8. 论文解读(DCN)《Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering》

    论文信息 论文标题:Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering论文作者:Bo Yang, Xi ...

  9. 程序分析与优化 - 9 附录 XLA的缓冲区指派

    本章是系列文章的案例学习,不属于正篇,主要介绍了TensorFlow引入的XLA的优化算法.XLA也有很多局限性,XLA更多的是进行合并,但有时候如果参数特别多的场景下,也需要进行分割.XLA没有数据 ...

  10. 如何等待ajax完成再执行相应操作

    ajax广泛应用于异步请求,对于大多数业务来说,这是十分方便的,但对于一些特殊的业务,ajax的异步性会起到相反的作用. 例如在ajax请求成功后,后续的操作需要依赖ajax执行成功后的相应操作. / ...