码迷,mamicode.com
首页 > 其他好文 > 详细

poj2115 C Looooops(exgcd)

时间:2018-11-03 12:34:25      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:mod   exgcd   main   分享图片   系统   iostream   ret   分享   mes   

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

 

poj2115 C Looooops(exgcd)

标签:mod   exgcd   main   分享图片   系统   iostream   ret   分享   mes   

原文地址:https://www.cnblogs.com/kafuuchino/p/9899980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!