poj2115 C Looooops(exgcd)

poj2115 C Looooops

题意:

对于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 }
View Code

 

posted @ 2018-11-03 10:49  kafuuchino  阅读(184)  评论(0编辑  收藏  举报