题意:
问什么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; }