孙子

Preface

数论学习Part 7。
每天进步一点点,退役不会太丢脸。


联赛只剩十五天,隔靴搔痒智何添?
剩余定理四天一篇,动归图论又几何,数据结构似云烟。
莫再等闲,莫忘时间。

CRT

我们小时候都做过这种问题,一个数 x x x它满足 x ≡ { a 1 m o d p 1 a 2 m o d p 2 ⋮ a n m o d p n x\equiv \begin{cases}a_1 &\mod p_1 \\ a_2 &\mod p_2 \\ &\vdots \\ a_n & \mod p_n\end{cases} x≡⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​a1​a2​an​​modp1​modp2​⋮modpn​​,然后让你求出一个最小的x出来。要求所有的 p p p互质。

遇到这种问题以前的我一般会各写几项出来,然后找相同。
这个时候孙子站了出来,他说出:记 P = ∏ p P=\prod p P=∏p,则 x = ∑ k = 1 k = n a k P p k t k x=\sum_{k=1}^{k=n}a_k{\frac{P}{p_k}}t_k x=∑k=1k=n​ak​pk​P​tk​, t k 是 P p k 关 于 p k 的 逆 元 t_k是\frac{P}{p_k}关于p_k的逆元 tk​是pk​P​关于pk​的逆元。这是x的一个解,如果你逆元是最小正逆元,那这个x就是最小正解。

为什么呢?
证明啊……。

先 看 x ≡ a 1 m o d p 1 。 先看x\equiv a_1 \mod p_1。 先看x≡a1​modp1​。
因 为 P p 1 与 p 1 互 质 , 所 以 肯 定 找 得 到 数 t 1 使 得 P p 1 t 1 ≡ 1 m o d p 1 , 这 个 t 1 被 称 为 P p 1 关 于 p 1 的 逆 元 。 因为\frac{P}{p_1}与p_1互质,所以\href{https://blog.csdn.net/c20182030/article/details/102631472#11_20}{肯定找得到数t_1使得\frac{P}{p_1}t_1\equiv 1\mod p_1},这个t_1被称为\frac{P}{p_1}关于p_1的逆元。 因为p1​P​与p1​互质,所以肯定找得到数t1​使得p1​P​t1​≡1modp1​,这个t1​被称为p1​P​关于p1​的逆元。
那 么 就 有 x ≡ a 1 ≡ a 1 × 1 ≡ a 1 P p 1 p 1 m o d p 1 。 那么就有x\equiv a_1\equiv a_1\times 1\equiv a_1\frac{P}{p_1}p_1\mod p_1。 那么就有x≡a1​≡a1​×1≡a1​p1​P​p1​modp1​。
因 为 P p 1 = p 2 × p 3 × ⋯ × p n , 所 以 有 a 1 P p 1 p 1 ≡ 0 ( m o d p 2 ) , ( m o d p 3 ) , ⋯ , ( m o d p n ) 。 因为\frac{P}{p_1}=p_2\times p_3\times \cdots \times p_n,所以有a_1\frac{P}{p_1}p_1\equiv 0 \pmod {p_2},\pmod{p_3},\cdots,\pmod {p_n}。 因为p1​P​=p2​×p3​×⋯×pn​,所以有a1​p1​P​p1​≡0(modp2​),(modp3​),⋯,(modpn​)。←不标准的表达,应当扣分
以 此 类 推 , a 2 P p 2 t 2 就 满 足 模 p 2 时 与 x 同 余 , 模 其 它 p 的 时 候 得 到 0 。 以此类推,a_2\frac{P}{p_2}t_2就满足模p_2时与x同余,模其它p的时候得到0。 以此类推,a2​p2​P​t2​就满足模p2​时与x同余,模其它p的时候得到0。
那 么 这 些 东 西 的 和 — — s = ∑ k = 1 k = n a k P p k t k , 一 定 满 足 s ≡ a 1 + 0 × ( n − 1 ) m o d p 1 , 那么这些东西的和——s=\sum_{k=1}^{k=n}a_k{\frac{P}{p_k}}t_k,一定满足s\equiv a_1+0\times(n-1)\mod p_1, 那么这些东西的和——s=∑k=1k=n​ak​pk​P​tk​,一定满足s≡a1​+0×(n−1)modp1​, s ≡ a 2 + 0 × ( n − 1 ) m o d p 2 , s\equiv a_2+0\times(n-1)\mod p_2, s≡a2​+0×(n−1)modp2​, s ≡ a 3 + 0 × ( n − 1 ) m o d p 3 , ⋯ , s\equiv a_3+0\times(n-1)\mod p_3,\cdots, s≡a3​+0×(n−1)modp3​,⋯, s ≡ a n + 0 × ( n − 1 ) m o d p n s\equiv a_n+0\times(n-1)\mod p_n s≡an​+0×(n−1)modpn​,所以可以认为 s s s是原方程的一个解。那么通解就是 s + z P , z ∈ Z s+zP,z\in \Z s+zP,z∈Z。

Q.E.D
就这?

代码

洛谷板子题,双倍经验。

曹冲养猪

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long ll;
void Read(ll &p)
{p=0;int f=1;char c=getchar();while(c<'0' || c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9')p=p*10+c-'0',c=getchar();p*=f;
}void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{if(!b){d=a,x=1,y=0; return;}exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}ll n,ans,d,x,y,P=1,a[1024],p[1024];int main()
{Read(n);for(ll i=1;i<=n;i++) Read(p[i]),Read(a[i]),P*=p[i];for(ll i=1;i<=n;i++) exgcd(P/p[i],p[i],d,x,y),ans+=a[i]*(P/p[i])%p*x,((ans%=P)+=P)%=P;

[TJOI2009]猜数字。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long ll;
void Read(ll &p)
{p=0;int f=1;char c=getchar();while(c<'0' || c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9')p=p*10+c-'0',c=getchar();p*=f;
}void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{if(!b){d=a,x=1,y=0; return;}exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}ll mul(ll a,ll b,ll p)
{return ((a*b-(ll)((long double)a/p*b+1e-8)*p)%p+p)%p;
}ll n,ans,d,x,y,P,a[1024],p[1024];int main()
{Read(n),P=1;for(ll i=1;i<=n;i++) Read(a[i]);for(ll i=1;i<=n;i++) Read(p[i]),((a[i]%=p[i])+=p[i])%=p[i],P*=p[i];for(ll i=1;i<=n;i++) exgcd(P/p[i],p[i],d,x,y),ans+=mul(mul(a[i],P/p[i],P),x,P),((ans%=P)+=P)%=P;printf("%lld\n",ans);
}

EXCRT

现在这些p不一定互质了。

我们先看头两个方程吼, { x ≡ a 1 m o d p 1 x ≡ a 2 m o d p 2 \begin{cases}x\equiv a_1\mod p_1\\x\equiv a_2 \mod p_2\end{cases} {x≡a1​modp1​x≡a2​modp2​​。
那么就有 x = k 1 × p 1 + a 1 = k 2 × p 2 + a 2 ⇒ k 1 × p 1 − k 2 × p 2 = a 2 − a 1 x=k_1\times p_1+a_1=k_2\times p_2+a_2\rArr k_1\times p_1-k_2\times p_2=a_2-a_1 x=k1​×p1​+a1​=k2​×p2​+a2​⇒k1​×p1​−k2​×p2​=a2​−a1​。
令 g c d ( p 1 , p 2 ) = g gcd(p_1,p_2)=g gcd(p1​,p2​)=g,则同时除就有 k 1 p 1 g − k 2 p 2 g = a 2 − a 1 g ⟺ k 1 p 1 g ≡ a 2 − a 1 g m o d p 2 g k_1\frac{p_1}{g}-k_2\frac{p_2}{g}=\frac{a_2-a_1}{g}\iff k_1\frac{p_1}{g}\equiv \frac{a_2-a_1}{g}\mod {\frac{p_2}{g}} k1​gp1​​−k2​gp2​​=ga2​−a1​​⟺k1​gp1​​≡ga2​−a1​​modgp2​​,其中 g c d ( p 1 g , p 2 g ) = 1 gcd(\frac{p_1}{g},\frac{p_2}{g})=1 gcd(gp1​​,gp2​​)=1。
注意,如果 g ∤ a 2 − a 1 g\nmid {a_2-a_1} g∤a2​−a1​,则无解。
因为这两个数互质,所以可以求出逆元来,就有: k 1 ≡ a 2 − a 1 g × ( p 1 g ) − 1 m o d p 2 g k_1\equiv \frac{a_2-a_1}{g}\times (\frac{p_1}{g})^{-1}\mod \frac{p_2}{g} k1​≡ga2​−a1​​×(gp1​​)−1modgp2​​。
所以设 k 1 = q × p 2 g + a 2 − a 1 g × ( p 1 g ) − 1 k_1=q\times \frac{p_2}{g}+\frac{a_2-a_1}{g}\times (\frac{p_1}{g})^{-1} k1​=q×gp2​​+ga2​−a1​​×(gp1​​)−1。

知道 k 1 k_1 k1​了,我们就知道了 x x x。
x = k 1 × p 1 + a 1 = ( q × p 2 g + a 2 − a 1 g × ( p 1 g ) − 1 ) × p 1 + a 1 = q × p 1 p 2 g + a 2 − a 1 g × ( p 1 g ) − 1 × p 1 + a 1 x=k_1\times p_1+a_1=\left(q\times \frac{p_2}{g}+\frac{a_2-a_1}{g}\times (\frac{p_1}{g})^{-1}\right) \times p_1+a_1=q\times\frac{p_1p_2}{g}+\frac{a_2-a_1}{g}\times (\frac{p_1}{g})^{-1}\times p_1+a_1 x=k1​×p1​+a1​=(q×gp2​​+ga2​−a1​​×(gp1​​)−1)×p1​+a1​=q×gp1​p2​​+ga2​−a1​​×(gp1​​)−1×p1​+a1​
⟺ x ≡ a 2 − a 1 g × ( p 1 g ) − 1 × p 1 + a 1 m o d p 1 p 2 g \iff x\equiv\frac{a_2-a_1}{g}\times (\frac{p_1}{g})^{-1}\times p_1+a_1 \mod \frac{p_1p_2}{g} ⟺x≡ga2​−a1​​×(gp1​​)−1×p1​+a1​modgp1​p2​​。

我们把两个同余式合成了一个,太棒了。
看来我们可以做很多次,最后得到一个方程 x ≡ A m o d B x\equiv A\mod B x≡AmodB。
x x x肯定可以随便解了。

代码

洛谷板子题,【模板】扩展中国剩余定理(EXCRT)。

居然一次过编译过样例,还直接A掉了。
我佛了。

太丑了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long ll;
void Read(ll &p)
{p=0;int f=1;char c=getchar();while(c<'0' || c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9')p=p*10+c-'0',c=getchar();p*=f;
}ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{if(!b){d=a,x=1,y=0; return;}exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}ll mul(ll a,ll b,ll p)
{return ((a*b-(ll)((long double)a/p*b+1e-8)*p)%p+p)%p;
}ll n,A,B,C,D,E,d,p,x,y;int main()
{Read(n),n--,Read(B),Read(A);while(n--) Read(D),Read(C),d=gcd(B,D),exgcd(B/d,D/d,p,x,y),E=B/d*D,(A+=mul(mul((C-A)/d,x,E),B,E))%=E,B=E;printf("%lld\n",(A%B+B)%B);
}

CanKaoWenXian

CRT:其实是在我看了好几篇举个例子就说自己证好了的博客以后,再看到这篇博客的时候突然懂了,所以就以这篇博客为参考文献了。不过这篇文章确实给了我参考。


EXCRT
贞德真的好看。(不是贞德当我没说)

说在后面

问了问数竞的同学,他们的中国剩余定理是证明其有解,然后数学归纳法就整出来了。
好吧,他们确实算不出来逆元。

【原创】 中国剩余定理 和 拓展中国剩余定理相关推荐

  1. ACM数论----中国剩余定理与拓展中国剩余定理

    一.问题引入: 在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?"这个问 ...

  2. 中国剩余定理学习 拓展中国剩余定理

    中国剩余定理学习 && 拓展中国剩余定理 中国剩余定理: 拓展中国剩余定理: 中国剩余定理: 仅供自己复习时查看一下大佬笔记,详细学习过程在大佬的博客. 学习连接:https://ww ...

  3. 中国剩余定理与扩展中国剩余定理

    中国剩余定理又名孙子定理 用来求解同余线性方程组 其中m1,m2,m3-两两互质,求x的最小整数解: 设M为m1,m2,m3-的公倍数. 根据上面的推导,为什么x的通解形式是累加呢? 根据上面推导,推 ...

  4. 中国剩余定理及扩展中国剩余定理

    目录 中国剩余定理CRT 扩展中国剩余定理ExCRT TJOI2009 猜数字 HDU 1573 X问题 中国剩余定理CRT 中国剩余定理是用来求线性同于方程组的. \[ \begin{aligned ...

  5. 博客处女作:中国剩余定理与扩展中国剩余定理

    各位好啊,这里是蒟蒻gigo_64的第一篇博客,,这里我们开始啦. 本文需要读者知晓扩展欧几里得,如果不会请点击这个大佬的链接;https://blog.csdn.net/sslz_fsy/artic ...

  6. 中国剩余定理以及扩展中国剩余定理

    中国剩余定理必须有两两互质的条件:而扩展中国剩余定理没有限制(可能互质,也能不互质).所以只记忆一个扩展中国剩余定理的板子就行. 代码 #include <iostream> #inclu ...

  7. CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF338D GCD Table(拓展中国剩余定理,细节处理,2900分) Problem 有一张 n ...

  8. 中国剩余定理拓展中国剩余定理

    复习 中国剩余定理: x ≡ a 1 ( m o d m 1 ) x ≡a_1(mod m_1) x≡a1​(modm1​) x ≡ a 2 ( m o d m 2 ) x ≡a_2(mod m_2) ...

  9. 数学:拓展中国剩余定理

    拓展中国剩余定理解决模数不互质同余方程组 如果模数互质的话,直接中国剩余定理就可以了 但是如果模数不互质又没有接触这个方法就凉凉了 推是很不好推出来的 假设我们这里有两个方程: x=a1∗x1+b1 ...

最新文章

  1. 0308-标签的用法(a,ul/ol,table)
  2. 【转载】闲话操作系统(二)
  3. VS.Net 2005 Beta2连接Team Foundation Server的问题
  4. 【Python】一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移...
  5. html5页面被键盘挡住,HTML5 虚拟键盘出现挡住输入框怎么办
  6. CSS3动画---移动端上下固定高度,中间自适应
  7. TCP/IP协议讲的明明白白
  8. linux文件 run.man,【Linux】linux经常使用基本命令
  9. BZOJ1010玩具装箱 - 斜率优化dp
  10. python编程狮苹果系统_Python编程狮app下载-Python编程狮苹果版v1.0
  11. .Net 读取xml
  12. CodeIgniter框架中的多语言
  13. Android播放在线音乐文件
  14. 百度和bing的背景肤色图片的保存
  15. WinRAR去除广告
  16. redis HSCAN命令及jedis的hscan方法
  17. 连虚拟机mysql_实体机连虚拟机MYSQL联接不上
  18. 斯坦福公开课一键下载
  19. Java 入门-02-人机交互-图形化界面的小故事
  20. 火狐浏览器和ie_浏览器趋势2016年5月:Firefox最终超过IE

热门文章

  1. 五分钟精通正则表达式,如果没精通,那就再加两分钟
  2. A星寻路在2.5D游戏中的实现
  3. APICloud联合腾讯云推出“云主机解决方案“,各种福利等你拿
  4. 数据结构C语言实现高铁客运订票系统
  5. Qt之开源绘图控件QCustomPlot
  6. 个人总结Android面试题目之二
  7. ChatGPT会让程序员失业?ChatGPT:“ 是友军,我不从事任何职业。
  8. 整理一篇不错的关于软件加密的文章
  9. 电力工程做什么的?电力工程怎么接项目?
  10. 最全的卫星影像分辨率和传感器参数汇总SPOT、IKONOS、QB、北京一号、ZY-1-02C