中国剩余定理
中国剩余定理,,用于求解模数两两互质的一元线性同余方程组。
计算所有模数的积 .
对于第 个方程,设 ,计算 ,设,不对 取模。
方程组在 下的唯一解为 .
inline int CRT(int k,int a[],int r[]){ int n=1,ans=0; for(int i=1;i<=k;i++)n*=r[i];/*计算所有模数的乘积*/ for(int i=1;i<=k;i++){ int m=n/r[i],x,y;/*m mod 其他所有r[i]均为0*/ exgcd(m,r[i],x,y);/*计算m mod r[i]的逆元x*/ (ans+=a[i]*m*x%n)%=n; } return (ans%n+n)%n; }
证明.
当 时,.
.
.
扩展中国剩余定理。
用于求解模数不一定互质的一元线性同余方程组。
考虑对于前两个同余方程,,则有 ,.
设 ,通过 可以得到通解,.
将 调整到最小正整数解,.
再带入原方程求解得到合并后的 ,.
设前 个方程的一个解为 ,设 ,则有 为前 个方程的通解,考虑加入第 个方程后,要求一个正整数 使得 ,移项,,通过 得到最小正整数 ,则前 个方程的通解为 .
inline int exCRT(int n,int a[],int r[]){ int ans=a[1]/*上一次合并后的余数*/,m=r[1]/*上一次合并后的模数*/; for(int i=2;i<=n;i++){/*进行同余方程的合并*/ int b=(a[i]-ans%r[i]+r[i])%r[i],x,y,g=exgcd(m,r[i],x,y)/*对新旧方程的模数求exgcd*/,k=r[i]/g; if(b%g)return -1;/*判断无解的情况*/ x=(x*b/g%k+k)%k;/*调整到最小正整数解*/ ans+=x*m;/*得到前i个方程的解*/ m*=k;/*合并模数,也就是之前所有模数的lcm*/ ans=(ans%m+m)%m; } return (ans%m+m)%m; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!