题意:
问什么A加上C取模2k等于B,其中经历了几次循环,还是永远无法使等式成立。

思路:
有题意知(A + x * C) mod 2^k = B mod 2^k可以推导出x * C + y * 2^k = B - A所以就有 a = C, b = 2^k, c = B - A, 然后就是扩展欧几里得得模板了。还有记住要用longlong还有就是在计算2^k时一般就是用1 << k,这样的话在1得时候记得将类型强制转换。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll Exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll g = Exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;
    return g;
}
int main() {
    ll a, b, c, k;
    while (scanf("%lld %lld %lld %lld", &a, &b, &c, &k)!= EOF && a + b + c + k) {
        ll x, y, aa = c, bb = (1ll << k), cc = b - a;
        ll gcd = Exgcd(aa, bb, x, y);
        if (cc % gcd != 0) printf("FOREVER\n");
        else {
            x *= cc / gcd;
            ll t = bb / gcd;
            x = (x % t + t) % t;
            printf("%lld\n", x);
        }
    }
    return 0;
}