// 356K 0MS G++
#include <stdio.h>
#include <string.h>
long long EXTENDED_EUCLID(long long a,long long b,long long& x,long long& y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long d = EXTENDED_EUCLID(b,a%b,x,y);
long long xt = x;
x=y;
y=xt-a/b*y;
return d;
}
int main(void)
{
long long A,B,C,k;
while(scanf("%lld %lld %lld %lld", &A,&B,&C,&k))
{
if(!A && !B && !C && !k) {
break;
}
long long a = C;
long long b = B-A;
long long n = (long long)1<<k;
long long x,y;
long long d = EXTENDED_EUCLID(a,n,x,y);
if (b%d != 0) {
printf("FOREVER\n");
} else {
x = (x*(b/d))%n;
x = (x%(n/d)+n/d)%(n/d);
printf("%lld\n", x);
}
}
return 0;
}
好的题解:
http://blog.csdn.net/lyy289065406/article/details/6648546
数论的题很多完全是靠公式,转化难度其实不大,这道题中,设经过X步C以后,可以从A 到 B,
那么因为存在溢出(溢出在这里其实就是求余了)的情况, 那么有 (A + XC)% 2的K次方 = B, 这是一个模线性等式,其他的参考上面的题解,已经很清楚了.