题意:
问什么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;
}
京公网安备 11010502036488号