poj2115 C Looooops(exgcd)
题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
(k位==mod $2^{k}$)
列出方程:$A+Cx\equiv B(mode\quad 2^{k})$
转换一下:$Cx+ky=B-A$
用exgcd解出 $Cx+ky=gcd(C,k)$
然后把求出的$x*(B-A)/gcd(C,k)$
再$\% (k/gcd(C,k))$求个最小正整数解
end.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 typedef long long ll; 7 ll A,B,C,k,g,x0,y0,q; 8 void exgcd(ll a,ll b,ll &x,ll &y){ 9 if(!b) g=a,x=1,y=0; 10 else exgcd(b,a%b,y,x),y-=x*(a/b); 11 } 12 int main(){ 13 while(cin>>A>>B>>C>>k){ 14 if(!A&&!B&&!C&&!k) break; 15 k=1ll<<k; //注意long long 用位运算 要 1ll 16 exgcd(C,k,x0,y0); q=k/g; 17 if((B-A)%g) cout<<"FOREVER"<<endl; 18 else{ 19 x0=(x0*(B-A)/g%q+q)%q; 20 cout<<x0<<endl; 21 } 22 }return 0; 23 }