孙子定理及扩展孙子定理
孙子定理及扩展孙子定理
中国剩余定理 (Chinese Remainder Theorem)
CRT是解决下列同余方程问题的,mi,mjm_i,m_jmi,mj两两互质。
该定理只需要用到两个取余知识点:
1.a%b=c→(a+kb)%b=ca\%b=c\rightarrow (a+kb)\%b=ca%b=c→(a+kb)%b=c
2.a%b=c→(ka)%b=kc(kc<b)a\%b=c\rightarrow (ka)\%b=kc\ (kc<b)a%b=c→(ka)%b=kc (kc<b)
该问题当模数两两互质必有解。
令MiM_iMi是除了mim_imi之外的所有mjm_jmj的lcm=∏j=1nm[j]m[i]lcm=\dfrac{\prod\limits_{j=1}^nm[j]}{m[i]}lcm=m[i]j=1∏nm[j]。
令Mit≡1(modmi)M_it\equiv 1\pmod{m_i}Mit≡1(modmi)
⇒Mit+miy=1\Rightarrow M_it+m_iy=1⇒Mit+miy=1
由exgcdexgcdexgcd可解出ttt。
这个满足x≡ai(modmi)x\equiv a_i\pmod{m_i}x≡ai(modmi)的式子,我们先找到该式余1的解:MitM_itMit。
然后由知识222可得,ai×Mi×t(modmi)=aia_i\times M_i\times t\pmod{m_i}=a_iai×Mi×t(modmi)=ai
最后的答案就是:∑i=1naiMiti(modM)\sum\limits_{i=1}^n a_iM_it_i\pmod{M}i=1∑naiMiti(modM)
该解是最小正整数解。
代码
void exgcd(ll a,ll b,ll &x,ll &y){//ax+by=1if(!b){x=1,y=0;return;}exgcd(b,a%b,y,x); y-=(a/b)*x;
}
ll m[N],a[N];//m[i] modulus (relatively prime) a[i] remainder
ll crt(int n){ //Chinese Remainder Theorem (nlogM)ll M=1;//product of modulusfor(int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]),M*=m[i];ll ans=0;for(int i=1;i<=n;i++){ll x,y;ll u=M/m[i];// Inverseexgcd(u,m[i],x,y);// ux+m[i]y=1ans=(ans+1LL*a[i]*u*x%M)%M; //sum of a[i]*u*x}return (ans%M+M)%M;//Minimum positve integer
}
扩展中国剩余定理
假设我们已经求出前i−1i-1i−1个方程的解xxx,且令M=lcm{mj}j∈[1,i−1]M=lcm\{m_j\} j\in[1,i-1]M=lcm{mj}j∈[1,i−1]
则xxx的通解为:x+kMx+kMx+kM
对于第iii个方程:(x+kM)≡ai(modmi)(x+kM)\equiv a_i\pmod{m_i}(x+kM)≡ai(modmi)
即:kM=(ai−x)(modmi)kM=(a_i-x)\pmod{m_i}kM=(ai−x)(modmi)
kM+miy=(ai−x)kM+m_iy=(a_i-x)kM+miy=(ai−x)
由exgcdexgcdexgcd可解得:kkk。
所以前iii个方程的解x′=x+kMx'=x+kMx′=x+kM,然后更新M=lcm(M,mi)M=lcm(M,m_i)M=lcm(M,mi)进入下个方程即可。
代码
ll exgcd(ll a,ll b,ll &x,ll &y){//ax+by=1if(!b){x=1,y=0;return a;}ll g=exgcd(b,a%b,y,x); y-=(a/b)*x;return g;
}
ll qmul(ll a,ll b,ll m){ll s=0;while(b){if(b&1) s=(s+a)%m;a=(a+a)%m;b>>=1;}return s;
}
ll m[N],a[N];//m[i] modulus (relatively prime) a[i] remainder
ll excrt(int n){ //Chinese Remainder Theorem (nlogM)ll M=1,ans=0;//product of modulusfor(int i=1;i<=n;i++){ll x,y,c=(a[i]-ans%m[i]+m[i])%m[i];ll g=exgcd(M,m[i],x,y);if(c%g) return -1;//no answerll g1=m[i]/g,g2=c/g;x=qmul(x,g2,g1);ans+=x*M;M*=g1;ans=(ans%M+M)%M;}return (ans%M+M)%M;//Minimum positve integer
}
Hint
求 {kix=ai(modmi)}\{k_ix=a_i\pmod{m_i}\}{kix=ai(modmi)}
类似excrtexcrtexcrt
已知前i−1i-1i−1个方程的通解:x+tMx+tMx+tM
则ki(x+tM)=ai(modmi)k_i(x+tM)=a_i\pmod{m_i}ki(x+tM)=ai(modmi)
(kiM)t+miy=ai−kix(k_iM)t+m_iy=a_i-k_ix(kiM)t+miy=ai−kix
由exgcdexgcdexgcd可解得ttt。
因此可求出xxx。
记忆方法
上述两个定理的关键都是:mix+Miy=cm_ix+M_iy=cmix+Miy=c 解出xxx。
一个是:Mix+miy=1M_ix+m_iy=1Mix+miy=1
ans=∑aiMix(modM)ans=\sum a_iM_ix \pmod{M}ans=∑aiMix(modM)
一个是:Mix+miy=(ai−ans)M_ix+m_iy=(a_i-ans)Mix+miy=(ai−ans)
ans=∑Mix(modM)ans=\sum M_ix \pmod{M}ans=∑Mix(modM)
参考文章
具体证明可参考这篇文章
传送门
传送门
习题
P4777 【模板】扩展中国剩余定理(EXCRT)
P1495 【模板】中国剩余定理(CRT)/曹冲养猪
ABC 193 E(EXCRT 板子)
POJ 1006 (CRT 板子)
孙子定理及扩展孙子定理相关推荐
- 组合数学 —— 组合数取模 —— 卢卡斯定理与扩展卢卡斯定理
[卢卡斯定理] 1.要求:p 是质数,m.n 很大但 p 很小 或者 n.m 不大但大于 p 2.定理内容 其中, 3.推论 当将 n 写成 p 进制:,将 m 写成 p 进制: 时,有: 4.实现 ...
- lucas定理及扩展lucas定理
还有一篇关于lucas定理的比较好的文章:关于LUCAS二项式系数同余定理的一些推广 转载原文链接:http://www.cnblogs.com/jianglangcaijin/p/3446839.h ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok's formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
组合数: 在N个数中选取M个数,问选的方式有几种? 直接递归暴力简单 #include<cstdio> const int N = 2000 + 5; const int MOD = (i ...
- P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)
P4720 [模板]扩展卢卡斯定理/exLucas 题意: CnmmodpC_{n}^{m}\bmod pCnmmodp 对于 100% 的数据,1≤m≤n≤1018,2≤p≤106,不保证 p 是 ...
- 洛谷 P4720 【模板】扩展卢卡斯定理/exLucas
[模板]扩展卢卡斯定理/exLucas 题目背景 这是一道模板题. 题目描述 求 Cnmmodp{\mathrm{C}}_n^m \bmod{p}Cnmmodp 其中 C\mathrm{C}C 为组 ...
- 裴蜀定理与扩展欧几里德算法
裴蜀定理又称贝祖定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍. 裴蜀定理的推广:方程ax+by+cz+-+nm=f(其中a,b,c-n,f为整数)有解的 ...
- 【知识总结】扩展卢卡斯定理(exLucas)
扩展卢卡斯定理用于求如下式子(其中 p p p不一定是质数): C n m m o d p C_n^m\ mod\ p Cnm mod p 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原 ...
- 【数学】扩展卢卡斯定理
Description 求 ( n m ) m o d p \dbinom{n}{m}\bmod p (mn)modp 其中 p p p 较小且 不保证 p p p 是质数. Method 前置芝士 ...
最新文章
- 慕课网_《Java微信公众号开发进阶》学习总结
- 使用火炬之光资源(转)
- spring boot + spring cloud 基础架构设计
- Linux学习笔记-基本操作2
- python解析html模块_Python HTMLParser模块解析html获取url实例
- ITK:计算CovariantVector的范数并将其标准化
- go语言1.4版本将支持面向android开发,[翻译]Go语言1.4版本将支持面向Android开发
- [UE4]C++中extern关键字浅谈
- CentOS 6 下升级安装Mysql 5.5 完整步骤
- windows下springboot项目部署elk日志系统教程elasticsearch与logstash与kibana
- TypeScript -脚本编程语言
- 010 Editor for Mac(十六进制编辑器)
- Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)
- ActiveReports 9 新功能:创新的报表分层设计理念
- 详解Visual Studio 2010中ASP.NET新增23项功能 转
- Ajax异步刷新,测试用户名是否被注册
- 如何让千牛工作台/阿里旺旺不要自动升级
- android微信分享成功后回调,微信分享成功后回调问题
- 显示器3d测试软件,IPS显示屏/裸眼3D显示原理及3D应用
- Discuz集思街淘宝客模板 程序源代码