exgcd求解同余方程的最小正整数解 poj1061 poj2115
这两题都是求解同余方程,并要求出最小正整数解的
对于给定的Ax=B(mod C) 要求x的最小正整数解
首先这个式子可转化为 Ax+Cy=B,那么先用exgcd求出Ax+Cy=gcd(A,C)的解x
然后这个式子的一个特解就是 (B/gcd(A,C))* x
要注意如果gcd(A,C)无法整除B,那么这个式子无解
然后是求出最小整数解
Ax+Cy=B 方程的通解是 x+k*C/gcd(A,C),
另s=C/gcd(A,C)
所以最小整数解是(x%s+s)%s
青蛙题
/* x+km=y+kn(mod L) x+km+t*L=y+kn k(m-n)+(x-y)=-t*L k(n-m)-(x-y)=t*L 要求出k 即(n-m)k = x-y(mod L) 那么(x-y)%gcd(n-m,L)==0 如果(x-y)%gcd(n-m,L)!=0,那么就是无解 用exgcd(n-m,l,x,y)出k0即可 答案是(x-y)/gcd(n-m,L)*k0+l/gcd(n-m,l) */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define ll long long ll x,y,m,n,L; ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0){x=1;y=0;return a;} ll d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } int main(){ while(cin>>x>>y>>m>>n>>L){ ll a=n-m,b=L,c=x-y,k,u; ll d=exgcd(a,b,k,u); if(c%d!=0){ puts("Impossible"); continue; } k=k*(c/d);//该方程特解 ll m=b/d; printf("%lld\n",(k%m+m)%m); } }
looop题
/* Cx=B-A(mod L) 转化为求同余方程 Cx+Ly=B-A d=gcd(C,L) d|B-A,则有解 exgcd(C,L,x,y)解得x 先求出一个特解x=(B-A)/d*x 然后再求最小整数解即可 */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define ll long long ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b){x=1,y=0;return a;} ll d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } int main(){ ll A,B,C,k,L; while(cin>>A>>B>>C>>k && (A||B||C||k) ){ L=1; for(int i=1;i<=k;i++) L*=2; ll d,x,y; d=exgcd(C,L,x,y); if((B-A)%d!=0){ puts("FOREVER"); continue; } x=(B-A)/d*x; ll s=L/d; cout<<(x%s+s)%s<<endl; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】