poj2115 C Looooops(exgcd)

Posted kafuuchino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2115 C Looooops(exgcd)相关的知识,希望对你有一定的参考价值。

poj2115 C Looooops

题意:

对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。

若在有限次内结束,则输出循环次数。

否则输出死循环。

(k位==mod $2^{k}$)

列出方程:$A+Cxequiv B(modequad 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

 

以上是关于poj2115 C Looooops(exgcd)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2115 C Looooops(exgcd)

POJ 2115 C-Looooops | exgcd

POJ - 2115C Looooops 扩展欧几里得(做的少了无法一眼看出)

POJ 2115 C Looooops

POJ2115 C Looooops

poj 2115 C Looooops