这个题目是其实就是求解线性同余方程,本质就是扩展欧几里德定理。参考我的博文POJ 1061:http://blog.csdn.net/zgkdzw/article/details/8811125
那里有详细讲解扩展欧几里德。这里就简单贴上代码:
#include <iostream>
#include <cstdio>
using namespace std;
long long gcd( long long a, long long b, long long &x, long long &y)
{
if ( b == 0 ) { x = 1; y = 0; return a; }
long long r = gcd(b, a%b, y, x);
y -= a/b*x;
return r;
}
int main()
{
long long a, b, c, d, x, y, p, ans, q;
long long i , g[33];
g[0] = 1;
for ( i = 1; i < 33; i++ )
g[i] = g[i-1]*2;
while ( scanf("%lld%lld%lld%lld", &a, &b, &c, &d) != EOF )
{
if ( d == 0 ) break;
if ( a == b ) { printf( "0\n"); continue; }
d = g[d]; q = b-a;
p = gcd(c,d,x,y);
if ( q % p ) { printf( "FOREVER\n" ); continue; }
x *= q/p; d /= p;
if ( x < 0 ) x = x%d+d; else x = x % d;
printf( "%lld\n", x );
}
}