这题写WA了多次,主要有两个原因:1.使用位运算的时候没有加LL导致溢出(题目正好给的是k=32)2.最后求解最小x的时候取模,不需要把mod再变回原来的值,因为此时x的值是在mod值变动之后求得的最小值,直接取mod就可以了
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return a;
}
else{
ll gcd=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return gcd;
}
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif // LOCAL
ll A,B,C,k,a,b;
while(cin>>A>>B>>C>>k&&(A||C||B||k)){
ll x,y,mod=(1ll<<k);
a=(B-A+mod)%mod;
b=C;
ll gcd=exgcd(b,mod,x,y);
if(a==0){
puts("0");
continue;
}
if(a%gcd||C==0){
puts("FOREVER");
continue;
}
else{
ll d=a/gcd;
b/=gcd,mod/=gcd;
exgcd(b,mod,x,y);
x*=d;
cout<<(x%mod+mod)%mod<<endl;
}
}
return 0;
}