POJ-2115 C Looooops
题意:就是求A+Cx=B(mod 1<<k)(式 1),的最小x的值。
思路:虽然脑袋很乱、不过还是水过。式 1可以转化为 Cx-2^ky=B-A,然后直接带扩展欧几里得即可。有一个地方需注意,移位的时候1<<k是错的,写成1LL<<k就过了.....
题目链接:http://poj.org/problem?id=2115
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 #define LL long long 10 11 LL a,b,c,d,A,B,C,k,x,y; 12 13 LL exgcd(LL a,LL b){ 14 LL t,d; 15 if(b==0){ 16 x=1; 17 y=0; 18 return a; 19 } 20 d=exgcd(b,a%b); 21 t=x; 22 x=y; 23 y=t-(a/b)*y; 24 return d; 25 } 26 27 int main(){ 28 29 // freopen("data.in","r",stdin); 30 // freopen("data.out","w",stdout); 31 32 while(scanf("%lld%lld%lld%lld",&A,&B,&C,&k),A||B||C||k){ 33 a=C; b=1LL<<k; c=B-A; //b=1<<k 就wrong...... 34 d=exgcd(a,b); 35 if(c%d) puts("FOREVER"); 36 else{ 37 x=x*c/d; 38 x=x-(x*d/b)*(b/d); 39 if(x<0) x+=b/d; 40 printf("%lld\n",x); 41 } 42 } 43 return 0; 44 }