题目
一个变量初始值为a,每次加c,取除以 2 k 2^k 2k的余数,使它与b相等。
分析
这道题可以变一下
a
+
c
x
≡
b
(
m
o
d
2
k
)
a+cx≡b(mod 2^k)
a+cx≡b(mod2k)
移项后变成
c
x
≡
b
−
a
(
m
o
d
2
k
)
cx≡b-a(mod 2^k)
cx≡b−a(mod2k)
没错,扩欧,具体解释懒得打。
代码
#include <cstdio>
using namespace std;
long long a,b,c,d,A,B,C,D,K,x,y;
long long exgcd(long long a,long long b,long long &x,long long &y){
if (b==0) d=a,x=1,y=0;
else exgcd(b,a%b,y,x),y=y-a/b*x;
}
int main(){
while (scanf("%lld%lld%lld%lld",&A,&B,&C,&K)&&(A||B||C||K)){
a=C; b=1ll<<K; c=B-A; exgcd(a,b,x,y);
if (c%d!=0) puts("FOREVER");
else{
x*=(c/d);
x=(x%(b/d)+(b/d))%(b/d);
printf("%lld\n",x);
}
}
return 0;
}