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

POJ 2115 C-Looooops | exgcd

时间:2017-11-27 18:50:53      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:for   问题   gcd   col   正整数   while   amp   cst   ==   

题目

给出一个循环for(int i=A;i!=B;i+=C) 在mod (1<<k) 下是否可以退出循环

是,输出时间,否输出FORVEER


 

题解:

题意可以变换成 A+Cx=B (mod 1<<k)

去掉mod之后变成 Cx=(B-A)+(1<<K)*y 是否有整数解

令 a=C,b=(1<<K) c=B-A

转化为ax+by=c的问题

exgcd即可

注意开longlong 要写1LL<<k 输出x最小正整数

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 typedef long long ll;
 5 using namespace std;
 6 ll A,B,C,x,y,k,a,b,g,c;
 7 ll exGcd(ll a,ll b,ll &x,ll &y)
 8 {
 9     if (b==0) return x=1,y=0,a;
10     ll r=exGcd(b,a%b,y,x);
11     y-=(a/b)*x;
12     return r;
13 }
14 int main()
15 {
16     while (scanf("%lld%lld%lld%lld",&A,&B,&C,&k) && A+B+C+k!=0)
17     {
18 
19     a=C;
20     b=(1LL<<k);
21     c=B-A;
22     g=exGcd(a,b,x,y);
23     if (c%g!=0) puts("FOREVER");
24     else
25     {
26         b/=g;
27         c/=g;
28         x=(x%b*c%b+b)%b;
29         printf("%lld\n",x);
30     }
31         
32     }
33     return 0;
34 }

 

POJ 2115 C-Looooops | exgcd

标签:for   问题   gcd   col   正整数   while   amp   cst   ==   

原文地址:http://www.cnblogs.com/mrsheep/p/7905217.html

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