扩展中国剩余定理学习笔记
扩展中国剩余定理
模板题:P4777
前置芝士:扩展欧几里得(exgcd)
不需要中国剩余定理。
问题:求
。
的最小整数解。
我们可以先关注前两个方程。
简单转换,可得:
所以
标准的拓欧板子,我们先用拓欧求出的一个特解 。
接着发现的通解为 。
带入
得:
。
现在很明显了,让 作新的 , 作新的 。
将这个柿子和接下来的柿子滚雪球一样一直合并,最后得出的最终方程中的即为答案,记得化成最小正整数。
注意点:
若合并过程中出现无解,即在求解特解时出现整个方程就都无解,直接退出。(当然这里保证有解)
有一个大数据要__int128或龟速乘,快速乘之类的,请注意。
code
#define int long long using namespace std; int n; bool has_ans=true; int a1,m1; int exgcd(int a,int b,int &x,int &y) { if(!b) { x=1,y=0; return a; } int d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } signed main() { scanf("%lld",&n); scanf("%lld%lld",&a1,&m1); for(int i=1;i<=n-1;++i) { int a2,m2; scanf("%lld%lld",&a2,&m2); int k1,k2; int d=exgcd(a1,a2,k1,k2); if((m2-m1)%d) { has_ans=false; break; } k1*=(m2-m1)/d; int t=a2/d; k1=(k1%t+t)%t; m1=a1*k1+m1; a1=abs(a1/d*a2); } if(has_ans) { printf("%lld",(m1%a1+a1)%a1); } else printf("-1"); return 0; }```
本文作者:StevenZC
本文链接:https://www.cnblogs.com/StevenZC/p/17085244.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步