题意:
。。。
思路:
和 青蛙的约会 差不多。。
d=B−A,m=2k
方程
Cx−my=d
先利用拓展gcd求出
Cx0−my0=g=gcd(C,m)
然后乘上倍数
Cx0∗d/g−my0∗d/g=d
最后求出最小正整数的解(见入门经典)
while (cin >> A >> B >> C >> k && (A+B+C+k)) {
if (A == B) {cout << 0 << endl;continue;}
if (A != B && C == 0) {cout << "FOREVER\n";continue;}
LL d = B - A, m = 1ll << k, g, x, y;
ex_gcd(C, m, g, x, y);
if (d%g) { // 无解
cout << "FOREVER\n";continue;
}
else { // 求得x的最小正整数解
m = m / g;
d = d / g;
LL ans = (x * d % m +m)%m;
cout << ans << endl;
}
}