与POJ 1061青蛙很像。
注意:for(int i=2;i!=1;i++) 循环到 i 值溢出时,会重新从0开始加。
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
void gcd(ll a,ll b,ll &d,ll &x,ll &y){
if(!b){d=a;x=1;y=0;}
else{ gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main(){
ll a,b,c,k;
while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k)&&(a||b||c||k)){
ll M = 1ll<<k;
ll d,x,y;
gcd(c,M,d,x,y);
ll C = b-a;
if(C%d!=0){ //如果推导的公式中的B-A不是d的倍数,则一定无解
printf("FOREVER\n");
}else{
x = (x*(C/d))%M; //gcd中的x的最小整数解
ll ans = (x%(M/d)+M/d)%(M/d); //通式(结果)的最小正整数解。
printf("%lld\n",ans);
}
}
return 0;
}