线性同余方程裸题,cx=(b-a) (mod 2^k)
AC代码:
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
//扩展欧几里得
//输入a,b,任意x,y
//返回ax+by=gcd(a,b)的一组特解x0,y0
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0){
x=1,y=0;
return a;
}
LL d=exgcd(b,a%b,x,y);
LL z=x;x=y;y=z-y*(a/b);
return d;
}
int main()
{
LL a,b,c,k;
while(cin>>a>>b>>c>>k){
if(!a&&!b&&!c&&!k) break;
k=(LL)(pow(2,k));
LL X0,Y0;
LL d=exgcd(c,k,X0,Y0);
if((b-a)%d!=0){
cout<<"FOREVER"<<endl;
continue;
}
LL temp=k/d;
LL X=X0*(b-a)/d;
LL ans=(X%temp+temp)%temp;
cout<<ans<<endl;
}
}