线性同余方程
题目所给的k位其实就是相当于计算机的各种整型。比如说int就是2^31-1,超过以后自动模掉。所以题目可以转化为求解同余方程 cx≡b−a(mod m) ,其中 m=1<<k 。
然后解一个一元线性同余方程就可以啦!注意平移的时候要强转LL。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL a,b,c,k;
LL exgcd(LL a,LL &x,LL b,LL &y){
if (b==0){
x=1; y=0; return a;
}
LL r=exgcd(b,x,a%b,y);
LL t=x; x=y; y=t-a/b*y;
return r;
}
int main(){
while (scanf("%lld%lld%lld%lld",&a,&b,&c,&k)==4&&(a||b||c||k)){
LL m=(LL)1<<k;
LL x,y;
LL r=exgcd(c,x,m,y);
if ((b-a)%r){
printf("FOREVER\n");
continue;
}
LL t=m/r;
x=x*((b-a)/r)%m;
x=(x%t+t)%t;
printf("%lld\n",x);
}
return 0;
}