同青蛙那道题类似,不过是化简式子的方法不一样,难度就在于化简。
欧几里得扩展。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long int ex(long long int a,long long int b,long long int &x,long long int &y)
{
if(a==0&&b==0)return -1;
if(b==0){
x=1;y=0;return a;
}
long long int d=ex(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
long long int a,b,c,k;
while(cin>>a>>b>>c>>k)
{
if(a==0&&b==0&&c==0&&k==0)break;
long long int M=pow(2,k);
long long int D=b-a;
long long int x,y;
long long int d=ex(c,M,x,y);
if(D%d!=0){
cout<<"FOREVER"<<endl;
continue;
}
long long int ans=x*D/d;
M/=d;
ans%=M;
if(ans<0)ans+=M;
cout<<ans<<endl;
}
return 0;
}
//化简等式,会发现是扩展欧几里得