http://poj.org/problem?id=2115
推出同余方程:C*x - 2^k*y = B -A直接使用扩展gcd求解!
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL exGcd(LL a, LL b, LL &x, LL &y){
if(b == 0){
x = 1;
y = 0;
return a;
}
LL gcd = exGcd(b, a%b, y, x);
y -= (a/b)*x;
return gcd;
}
int main(){
LL A,B,C,k;
while(scanf("%lld%lld%lld%lld", &A,&B,&C,&k) == 4){
if(!A && !B && !C && !k) break;
if(C == 0){
if(A == B) cout << "0" << endl;
else cout << "FOREVER" << endl;
continue;
}
LL a = C, b = -(1ll << k), c = B - A, x, y;
LL gcd = exGcd(a, b, x, y);
if(c % gcd){
cout << "FOREVER" << endl;
continue;
}
x *= c/gcd;
if(b / gcd < 0) b = -b;
x %= b/gcd;
while(x < 0) x += b/gcd;
cout << x << endl;
}
//system("pause");
return 0;
}