题解:c*x+a(mod 2^k) = b
化简得:c*x = b-a(mod 2^k)
求解一次同余式;
注意: b - a < 0的情况
#include<stdio.h>
#include<math.h>
typedef __int64 LL;
LL x,y;
LL gcd(LL a,LL b)
{
LL r;
while(b)
{
r = a%b;
a = b;
b = r;
}
return a;
}
void exgcd(LL a,LL b)
{
if(b==0){x=1,y=0;return;}
exgcd(b,a%b);
LL t = x;
x = y,y = t - a/b*y;
}
int main()
{
LL a,b,c,k;
while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k),a+b+c+k)
{
LL mod = pow(2,k);
LL r = ((b-a)%mod+mod)%mod;
LL d = gcd(c,mod);
if(r%d) {printf("FOREVER\n");continue;}
exgcd(c/d,mod/d);
LL MOD = mod / d;
x = (r/d*x%MOD+MOD)%MOD;
printf("%I64d\n",x);
}
}