分析:
题目大意为求解能使得 A + x * C = B 的最小的x
, 0 ≤ x < 2^k .题解:
我们可以先构造模线性方程,原式转换为 x * C = B - A ,即有 C*x = B - A (mod 2^k),(此处用到了模运算规则),得出标准模线性方程,利用扩展欧几里得即可求解。注意:int类型的移位计算如果超过30位会导致结果不准确,所以需要使用_int64 整数类型。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
__int64 x, y;
__int64 Extended_Euclid(__int64 a, __int64 b) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
__int64 m = Extended_Euclid(b, a % b);
__int64 tmp = x;
x = y;
y = tmp - a / b * y;
return m;
}
int main()
{
__int64 a, b, c, k;
while (scanf ("%I64d%I64d%I64d%I64d", &a, &b, &c, &k)) {
if (!a && !b && !c && !k) break;
__int64 d = (__int64)1<<k; //此处先讲1转化为64位,否则系统默认1为int型,右移32位会溢出
__int64 e = Extended_Euclid(c, d);
if ((b-a) % e) { printf ("FOREVER\n"); continue; }
__int64 t = d / e;
x = (x * (b - a) / e % t + t) % t;
printf ("%I64d\n", x);
}
return 0;
}