## 问题描述

  “今有物不知其数,三三数之余二,五五数之余三,七七数之余二。问物几何?”

  emmm这是。。最开始这个问题被提出来的描述

  其实说白了就是求解一次同余式组

  然后还可以。。解决一些。。需要将模数转化成素数来求解的题目

  

具体内容

  我们还是把这个东西写成数学语言吧,一般化一点的长这样:

\[\begin{cases}
x\equiv a_1(mod\ m_1)\\
x\equiv a_2(mod\ m_2)\\
x\equiv a_3(mod\ m_3)\\
...\\
x\equiv a_n(mod\ m_n)\\
\end{cases}
\]

  其中模数\(m_i\)两两互素,记\(N=\prod\limits_{i=1}^{n}m_i\),中国剩余定理说的是:这个同余方程组在模\(N\)意义下有唯一解,并且给出了一种具体的构造方案(也就是下面的证明)

​  

  证明:我们首先来考虑一个更加特殊一点的同余方程组

\[\begin{cases}
x\equiv 1(mod\ m_1)\\
x\equiv 0(mod\ m_2)\\
x\equiv 0(mod\ m_3)\\
...\\
x\equiv 0(mod\ m_n)\\
\end{cases}
\]

  我们可以大胆令\(x=(N/m_1)*y\),然后就会发现这个方程组就等价于求解同余方程:

\[(N/m_1)*y \equiv1(mod\ m_1)
\]

  然后对于我们改变一下左边等于\(1\)的等式是哪一条,如果是第\(i\)条的话那么就相当于求解:

\[(N/m_i)*y_i \equiv1(mod\ m_i)
\]

  那么我们令\(x_i=(N/m_i)*y_i\),就可以构造出原来的方程组(余数为\(a_i\)的那个方程组)在模\(N\)意义下的唯一解:

\[x=\sum_{i=1}^n a_ix_i
\]

  

具体实现

  那么现在我们只要求出\(y_i\)就好了,观察这个式子:

\[(N/m_i)*y_i \equiv1(mod\ m_i)
\]

​  会发现这个\(y_i\)我们可以用扩展欧几里得求出

  因为可以看成\(y_i(N/m_1)+q\cdot m_1=1\),而因为\(m_i\)是两两互素的所以\(1=gcd(N/m_1,m_1)\)

  那么直接就上扩欧就好啦

  

  代码大概长这个样子

ll ex_gcd(ll a,ll b,ll &x,ll &y){
if (b==0){x=1; y=0; return a;}
ll gcd=ex_gcd(b,a%b,x,y),tmp=x;
x=y; y=tmp-a/b*y;
return gcd;
} ll CRT(int *w,int *a,int n){//w数组里面存的是模数,a里面存的是余数
ll x,y,ret=0,mod=1,tmp;//这里的mod就是相当于上面讲的N啦
for (int i=1;i<=n;++i) mod*=w[i];
for (int i=1;i<=n;++i){
tmp=mod/w[i];
ex_gcd(w[i],tmp,x,y);
ret=(ret+y*tmp*a[i])%mod;
}
return (ret+mod)%mod;
}

  

具体应用

  应用的话。。其实就是像上面提到的那样,解决一些要拆模数的问题

  比如说 -->这题(bzoj3782)

  简单说一下就是,这题需要用到Lucas定理,但是这个定理有一个限制条件就是模数必须是质数,那么解决方法就是将模数分解质因数一下,然后分别用Lucas定理求出在几个质因数下的答案,最后用CRT(中国剩余定理)合并一下得到在模那个非质数的模数下的答案就好了

​  目前了解到的就主要是这样的类型的qwq

  在FFT中也有应用,但是还没有去写。。所以先留着坑吧qwq

  

不互质呢?

​  其实中国剩余定理的条件还是有点苛刻的,模数之间要两两互质

​  如果说不能满足这一点呢?

​​​  其实也是可以做的,虽然说叫是叫扩展CRT但是其实这个感觉跟CRT的思想不太一样嗯qwq

​​​  与前面的构造法不同的是,这里我们可以借助扩欧采用一个两两合并的思想

​  假设我们现在要合并两个方程:

\[\begin{cases}
x\equiv a_1(mod\ m_1)\\
x\equiv a_2(mod\ m_2)
\end{cases}
\]

​  但是其中\(,m_1,m_2\)是不互质的

​​​  我们可以将上面那个方程组写成

\[\begin{cases}
x=a_1+x_1\cdot m_1&(1)\\
x=a_2+x_2\cdot m_2&(2)
\end{cases}
\]

​  那么:

\[\begin{aligned}
x_1\cdot m_1-x_2\cdot m_2&=a_2-a_1\\
m_1\cdot x_1&\equiv a_2-a_1(mod\ m_2)
\end{aligned}
\]

​  然后我们考虑用逆元将系数\(m_1\)消掉,但是因为无法保证\(m_1m_2\)互质,所以我们可以先变一下,记\(d=gcd(m_1,m_2)\),则:

\[\begin{aligned}
\frac{m_1}{d}x_1&\equiv \frac{a_2-a_1}{d}(mod\ \frac{m_2}{d})\\
x_1&\equiv inv(\frac{m_1}{d})\frac{a_2-a_1}{d}(mod\ \frac{m_2}{d})\\
\Updownarrow\\
x_1&=a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d}+\frac{m_2}{d}\cdot y\\
\end{aligned}
\]

​  注意,由扩欧可以知道,只有在满足\(d|(a_2-a_1)\)的情况下有解​

​  然后这个时候我们再将这条\(x_1\)的表达式带回\((1)\)式中,得到:

\[\begin{aligned}
x&=a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d}+\frac{m_1m_2}{d}\cdot y\\
\Updownarrow\\
x&\equiv (a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d})\%\frac{m_1m_2}{d}(mod\ \frac{m_1m_2}{d})
\end{aligned}
\]

​  也就是说,最后我们合并得到的新的式子\(x\equiv a'(mod\ m')\)中:

\[\begin{aligned}
a'&=(a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d})\%\frac{m_1m_2}{d}\\
m'&=\frac{m_1m_2}{d}
\end{aligned}
\]

​  然后多个同余方程的话我们就两个两个一路合并下去就好了

​  

​​  代码大概长这个样子

ll mul(ll x,ll y,ll mod){//这里mul是为了防止模数特别大的情况下爆出去而用的黑科技
ll tmp=x*y-(ll)((ld)x/mod*y)*mod;
return (tmp+mod)%mod;
}
ll ex_gcd(ll a1,ll b1,ll &x,ll &y){
if (!b1){x=1; y=0; return a1;}
ll gcd=ex_gcd(b1,a1%b1,x,y),tmp=x;
x=y; y=tmp-a1/b1*y;
return gcd;
}
ll inv(ll a1,ll mod){
ll x,y;
ll gcd=ex_gcd(a1,mod,x,y);
if (gcd!=1) return -1;
return (x%mod+mod)%mod;
}
ll ex_CRT(ll *a,ll *mod,int n){
ll Mod=mod[1],A=a[1],d,tmp,t,x,y,tmpMod;
for (int i=2;i<=n;++i){
d=ex_gcd(Mod,mod[i],x,y);
tmp=a[i]-A;
if (tmp%d)
return -1;//不能整除就无解
tmpMod=Mod/d*mod[i];
A=(A+mul(mul(Mod,inv(Mod/d,mod[i]/d),tmpMod),tmp/d,tmpMod))%tmpMod;
Mod=tmpMod;
}
return (A%Mod+Mod)%Mod;
}

【learning】中国剩余定理的更多相关文章

  1. 《孙子算经》之"物不知数"题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

  2. POJ 1006 中国剩余定理

    #include <cstdio> int main() { // freopen("in.txt","r",stdin); ; while(sca ...

  3. [TCO 2012 Round 3A Level3] CowsMooing (数论,中国剩余定理,同余方程)

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=12083 这道题还是挺耐想的(至少对我来说是这样).开始时我只会60 ...

  4. poj1006中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103506   Accepted: 31995 Des ...

  5. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

  6. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  7. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

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

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

  9. hihocode 九十七周 中国剩余定理

    题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...

  10. hdu 3579 Hello Kiki 不互质的中国剩余定理

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

随机推荐

  1. Windows10 Oracle ODBC安装配置

    项目紧迫,需在短时间内交付成果,新团队成员,吐嘈之前数据库设计太low,很难看懂数据库表结构间的关系,为了使新同事更好的了解数据库表结构,特意使用powerDesigner对oracle.mysql数 ...

  2. leetcode个人题解——#43 Multiply Strings

    思路:高精度乘法就可以了. 有两个错误以前没在意,1.成员属性定义时候不能进行初始化, vector<); 这样隐性调用了函数进行初始化的形式特别要注意,也是错误的: 2.容器类只有分配了空间时 ...

  3. [redis] linux下哨兵篇(3)

    一.前言1.为何部署sentinel哨兵前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化.主要功能有:1)不时监控主从服务正常运行2)可 ...

  4. "Hello World!"团队第十次会议

    Scrum会议 今天是我们"Hello World!"团队第十次召开会议,博客内容是: 1.会议时间 2.会议成员 3.会议地点 4.会议内容 5.todo list 6.会议照片 ...

  5. AOP:静态代理实现方式①通过继承②通过接口

    文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...

  6. Alpha 冲刺(7/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...

  7. BETA阶段冲刺集合

    冲刺开始: https://www.cnblogs.com/LZTZ/p/9097296.html 第一天: https://www.cnblogs.com/LZTZ/p/9097303.html 第 ...

  8. Markdown的基本语法

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...

  9. haproxy入门 (作用: 高可用性,负载平衡和用于TCP和基于http的应用程序的代理)

    安装haproxy 1:RPM包安装 yum install -y haproxy   2:编译安装 http://www.haproxy.org/#down   例如安装1.7.9版本 http:/ ...

  10. rfid工作原理

    RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...