前言

一直觉得中国剩余定理很难,因为怕麻烦一直没有去搞,直到区域赛网络赛在即,直到……退役赛在即。(果然DDL是原生动力,可能是爱得不够深吧)学了一下,觉得其实也没那么难,如果理解不了证明的话,看懂每个变量表示的含义,利用结论 x = ∑ i = 1 n a i M i t i x= \sum_{i=1}^n a_iM_it_i x=∑i=1n​ai​Mi​ti​求解也可。

定理与证明

定理:若 m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1​,m2​,...,mn​是两两互质的正整数, M = ∏ i = 1 n m i , M i = M / m i , t i M=\prod_{i=1}^nm_i,M_i=M/m_i,t_i M=∏i=1n​mi​,Mi​=M/mi​,ti​是线性同余方程 M i t i ≡ 1 ( m o d m i ) M_it_i\equiv1(mod \, m_i) Mi​ti​≡1(modmi​)的一个解。对于任意n个整数 a 1 . a 2 , . . . , a n a_1.a_2,...,a_n a1​.a2​,...,an​,则同余方程组
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . x ≡ a n ( m o d m n ) \begin{cases} x \equiv a_1(mod \, m_1) \\ x \equiv a_2(mod \, m_2) \\ ...\\ x \equiv a_n(mod \, m_n) \\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧​x≡a1​(modm1​)x≡a2​(modm2​)...x≡an​(modmn​)​
有整数解,方程组的解为 x = a 1 M 1 t 1 + a 2 M 2 t 2 + . . . + a n M n t n x=a_1M_1t_1+a_2M_2t_2+...+a_nM_nt_n x=a1​M1​t1​+a2​M2​t2​+...+an​Mn​tn​。且在模 M M M意义下有唯一解。
PS:要看清楚 M , M i , t i M,M_i,t_i M,Mi​,ti​分别表示什么含义,才容易理解。

证明

∵ \because ∵ M i = M / m i M_i=M/m_i Mi​=M/mi​ 是除 m i m_i mi​ 以外所有模数的倍数
∴ \therefore ∴ ∀ k ≠ i , a i M i t i ≡ 0 ( m o d m k ) \forall \, k \neq i, \,a_iM_it_i \equiv0(mod \, m_k) ∀k​=i,ai​Mi​ti​≡0(modmk​)
∵ \because ∵ a i M i t i ≡ a i ( m o d m i ) a_iM_it_i \equiv a_i(mod \, m_i) ai​Mi​ti​≡ai​(modmi​)
又 ( a + b ) % p = a % p + b % p (a + b) \%p=a \%p+b \%p (a+b)%p=a%p+b%p
∴ \therefore ∴ 将 x = ∑ i = 1 n a i M i t i x= \sum_{i=1}^n a_iM_it_i x=∑i=1n​ai​Mi​ti​代入,原方程组成立
证毕。
(摘自:信息学奥赛一本通·提高版)

PS:如果不理解证明的话,可以尝试把 x = ∑ i = 1 n a i M i t i x= \sum_{i=1}^n a_iM_it_i x=∑i=1n​ai​Mi​ti​代回任意一项 k k k,你会发现除了 ( a k M k t k ) % m k = a k (a_kM_kt_k)\%m_k=a_k (ak​Mk​tk​)%mk​=ak​外,别的项都是等于0,最终相加等于 a i a_i ai​。(看不懂就慢慢模拟一遍嘛)

代码模板

/** m[i]是模数,a[i]是系数* 注意:m[i]之间必须两两互质*/
ll Crt(int n) {ll ans = 0, M = 1, Mi, xi, yi;for (int i = 1; i <= n; i++) M *= m[i];for (int i = 1; i <= n; i++) {Mi = M / m[i];extend_gcd(Mi, m[i], xi, yi);//保证求得的解为正整数ans = ((ans + Mi * xi * a[i]) % M + M) % M;}return ans;
}

模板题:#10212. 「一本通 6.4 例 4」曹冲养猪

代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
typedef long long ll;
const int maxn = 1005;
int n, a[maxn], m[maxn];
//快读
template <class T>
inline bool read(T &res) {char c; int sgn;if (c = getchar(), c == EOF) return 0;while (c != '-' && (c < '0' || c > '9')) c =getchar();sgn = (c == '-') ? -1 : 1;res = (c == '-') ? 0 : (c - '0');while (c = getchar(), c >= '0' && c <= '9') res = res * 10 + (c - '0');res *= sgn;return 1;
}
//快写
inline void write(ll x) {if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
//拓展欧几里德
ll extend_gcd(ll a, ll b, ll &x, ll &y) {if (x == 0 && y == 0) return -1;if (b == 0) {x = 1; y = 0;return a;}ll d = extend_gcd(b, a % b, y, x);y -= a / b * x;return d;
}ll China(int n) {ll ans = 0, M = 1, Mi, xi, yi;for (int i = 1; i <= n; i++) M *= m[i];for (int i = 1; i <= n; i++) {Mi = M / m[i];extend_gcd(Mi, m[i], xi, yi);ans = ((ans + Mi * xi * a[i]) % M + M) % M;}return ans;
}int main()
{read(n);for (int i = 1; i <= n; i++) {read(m[i]); read(a[i]);}write(China(n));return 0;
}

//哪有那么快,看不懂就静心细看
//想看定理的由来可以直接看数论的书

数论基础之中国剩余定理(附证明)相关推荐

  1. 【原创】 中国剩余定理 和 拓展中国剩余定理

    孙子 Preface 数论学习Part 7. 每天进步一点点,退役不会太丢脸. 联赛只剩十五天,隔靴搔痒智何添? 剩余定理四天一篇,动归图论又几何,数据结构似云烟. 莫再等闲,莫忘时间. CRT 我们 ...

  2. [基础数论]CRT中国剩余定理(模数互质与不互质)

    文章目录 参考 模数互质 分析 例题 模数不互质 分析 例题 后记 参考 中国剩余定理(Chinese remainder theorem,简称CRT)即孙子定理,最早可见于中国南北朝时期(公元5世纪 ...

  3. 中国剩余定理【数论】

    中国剩余定理的具体描述是这样的: 给出你n个ai和mi,最后让求出x的最小值是多少. 中国剩余定理说明:假设整数m1, m2, ... , mn两两互质,则对任意的整数:a1, a2, ... , a ...

  4. 第二十九章 数论——中国剩余定理与线性同余方程组

    第二十九章 数论--中国剩余定理与线性同余方程组 一.中国剩余定理 1.作用: 2.内容: 3.证明: (1)逆元的存在性 (2)验证定理的正确性 4.代码实现: (1)步骤: (2)问题: (3)代 ...

  5. 数论四大定理(欧拉定理、费马小定理、中国剩余定理、威尔逊定理)

    前置知识 同余 假设 a,ba,ba,b 都是整数,如果 nnn 是一个正整数,且存在整数 kkk 使得 a−b=k×na−b=k \times na−b=k×n,则称 a,ba,ba,b 模 nnn ...

  6. 数论——中国剩余定理及其扩展详解

    文章目录 概述 中国剩余定理扩展 例题 总结 概述 引入: 一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第二十六题,叫做"物不知数&qu ...

  7. 数学--数论--中国剩余定理+扩展中国剩余定理(孙子定理)

    中国剩余定理 问题 求解同余方程组 其中m1,m2,m3...mkm_1,m_2,m_3...m_km1​,m2​,m3​...mk​为两两互质的整数 求x的最小非负整数解 定理 令M=∏i=1kmi ...

  8. 中国剩余定理 (孙子定理) 的证明和代码

    目录 [引入] [中国剩余定理] [代码实现] [借鉴于] [引入] <孙子算经>里有这样一个题目:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 术曰:" ...

  9. 数论 之 中国剩余定理(孙子定理)

    1.中国剩余定理理解: 剩余定理,顾名思义就是和余数有关的操作,比如中国剩余定理解决的经典问题: 在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3 余2), ...

最新文章

  1. 【附超时原因】1055 The World‘s Richest (25 分)_42行代码AC
  2. oracle语句取字段前2位,oracle截取某一个字符之前或之后的值;substr();instr()
  3. ORACLE报错(5)ORA-01102: cannot mount database in EXCLUSIVE mode
  4. 经典实用数据库新书推荐-关于mysql和oracle【转孟光】
  5. 富士胶片携数据磁带亮相大数据产业博览会
  6. C语言-学生管理系统
  7. SpreadJS 14.2.5 中文版
  8. python微积分求面积_用Python学微积分(微积分应用)
  9. 【视频分享】尚硅谷Java视频教程_SpringBoot视频教程
  10. 驾考科目二考试经验谈
  11. oracle数据库表中文乱码,oracle数据库中文乱码的原因与解决
  12. weiphp短信接口教程
  13. 【实战】Spring+Spring MVC+Mybatis实战项目之云笔记项目
  14. php微信自动回复接口,微信接口自动回复
  15. COLMAP: Structure-from-Motion Revisited 论文阅读
  16. 序文 【IT圈是个什么玩意儿 1 】
  17. CSS Tailwind
  18. 湖北计算机科学与技术自考本科,自考本科计算机科学与技术入学时间
  19. WZOI-263细菌繁殖
  20. CodeForces刷题:Theatre Square、Watermelon、Chat Server‘s Outgoing Traffic、Triangle、Die Roll

热门文章

  1. 热心肠:关于肠道菌群和益生菌的10个观点
  2. 一维数组实验题:计算平均数、中位数和众数 在调查数据分析(Survey data analysis)中经常需要计算平均数、中位数和众数。用函数编程计算40个输入数据(是取值1—10之间的任意整数)的平
  3. 错误: 加载主类 OnePoint 时出现 LinkageError java.lang.UnsupportedClassVersionError: OnePoint has been compil
  4. 如何提取短视频文案?视频文案一键提取工具分享
  5. oracle over()
  6. 总结几个简单好用的Python人脸识别算法
  7. Java基础之《分布式事务(4)—分布式开源框架使用》
  8. FreeRTOS中mutex用法
  9. 网络编程知识巩固(二)
  10. order by,sort by,distribute by,cluster by的区别是什么?