传送门TP
题解:
A+X∗C=B(mod2k)
X∗C=[(B−A+2k)mod2k](mod2k)
X∗C+Y∗2k=[(B−A+2k)mod2k]
于是令 P=(B−A+2k)mod2k
解这个方程就可以了
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
void exgcd(long long a,long long b,long long& d,long long& x,long long& y){
if(b==0){x=1;y=0;d=a;}
else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
long long gcd(long long x,long long y){
if(y==0) return x;
else return gcd(y,x%y);
}
long long A,B,C,K;
int main(){
while(scanf("%lld%lld%lld%lld",&A,&B,&C,&K)!=EOF){
if(A==0&&B==0&&C==0&&K==0) break;
long long BASE=1;
for(register int i=1;i<=K;i++)BASE*=2;
long long Y=(B-A+BASE)%BASE;
long long N,D,GCD;
exgcd(C,BASE,GCD,N,D);
if(Y%GCD!=0){printf("FOREVER\n");continue;}
else{
N*=(Y/GCD);BASE=BASE/gcd(C,BASE);
N=(N%BASE+BASE)%BASE;
}
printf("%lld\n",N);
}
return 0;
}