POJ 2115 C Looooops 拓展欧几里得

来源:互联网 发布:cmmb电视模块软件 编辑:程序博客网 时间:2024/06/06 17:55

大概意思是有一个C/C++的循环语句

for(i=a;i!=b;i=i+c)然后这个i是个最大为2^k的数

也就是说如果i>=2^k就会减少2^k

求这个循环语句循环多少次会跳出 如果不能就输出FOREVER

显然可以转化成  b与a+cx同余2^k相等的最小正整数的解

代码:

#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL exgcd(LL &x,LL &y,LL a,LL b){if(b==0){x=1;y=0;return a;}LL d=exgcd(x,y,b,a%b);LL px=x;x=y;y=px-a/b*y;return d;}LL A,B,C,k;int main(){while(scanf("%lld%lld%lld%lld",&A,&B,&C,&k)==4){if(!A&&!B&&!C&&!k)break;LL a,b,c,d,x,y;a=C;b=1ll<<k;c=B-A;d=exgcd(x,y,a,b);if(c%d!=0)puts("FOREVER");else{x=x*(c/d);x=((x%(b/d))+(b/d))%(b/d);printf("%lld\n",x);}}return 0;}



0 0