POJ2115 C Looooops 扩展欧几里德
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - POJ2115
题意
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。若在有限次内结束,则输出循环次数。否则输出死循环。
题解
原题题意再次缩略:
A + xC Ξ B (mod 2k)
求x的最小正整数值。
我们把式子稍微变一下形:
Cx + (2k)y = B-A
然后就变成了一个基础的二元一次方程求解,扩展欧几里德套套就可以了。
至于扩展欧几里德(ex_gcd),自己网上学习吧。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; typedef long long LL; LL A,B,C,k,a,b,c,x,y,g; LL ex_gcd(LL a,LL b,LL &x,LL &y){ if (!b){ x=1,y=0; return a; } LL gcd=ex_gcd(b,a%b,y,x); y-=(a/b)*x; return gcd; } int main(){ while (~ scanf ( "%lld%lld%lld%lld" ,&A,&B,&C,&k)&&(A||B||C||k)){ k=1LL<<k; //A+xC=B (mod 2^k) //Cx+(2^k)y=B-A a=C,b=k,c=(B-A+k)%k; g=ex_gcd(a,b,x,y); if (c%g){ puts ( "FOREVER" ); continue ; } a/=g,c/=g,b/=g; x*=c,y*=c; x=(x%b+b)%b; printf ( "%lld\n" ,x); } return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步