【pku2115-C Looooops】拓展欧几里得-不定方程
http://poj.org/problem?id=2115
题解:一个变量从A开始加到B,每次加C并mod2^k,问加多少次。转化为不定方程:C*x+2^K*Y=B-A
//poj2115 #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; typedef long long LL; LL bit[40]; LL tx,ty; LL exgcd(LL a,LL b) { if(b==0) {tx=1,ty=0;return a;} LL d=exgcd(b,a%b); LL x=ty,y=tx-(a/b)*ty; tx=x;ty=y; return d; } int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); bit[0]=1; for(LL i=1;i<=32;i++) bit[i]=bit[i-1]*2; LL a,b,c,k; while(1) { scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k); if(!a && !b && !c && !k) return 0; LL A=c,B=bit[k],C=b-a; LL g=exgcd(A,B); if(C%g) printf("FOREVER\n"); else { LL x=tx*(C/g); x=(x%(B/g)+(B/g))%(B/g); printf("%I64d\n",x); } } return 0; }