POJ-2115 C Looooops 扩展GCD

这题就是一个简单扩展GCD,方程为 x*C + y * 2^k = B-A.

代码如下:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long int Int64;

Int64 A, B, C, K;

Int64 _pow(Int64 a, Int64 b)
{
    Int64 ret = 1;
    while (b) {
        if (b & 1) {
            ret *= a;
        }
        a *= a;
        b >>= 1;
    }
    return ret;
}

Int64 ext_gcd(Int64 a, Int64 b, Int64 &x, Int64 &y)
{
    int temp, ret;
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    ret = ext_gcd(b, a % b, x, y);
    temp = x, x = y, y = temp - a/b*y;
    return ret;
}

int main()
{
    Int64 g, x, y;
    while (scanf("%lld %lld %lld %lld", &A, &B, &C, &K), A|B|C|K) {
        Int64 a = C, b = _pow(2, K);
        g = ext_gcd(a, b, x, y);
        if ((B-A)%g != 0) {
            puts("FOREVER");
            continue;
        }
        x *= ((B-A)/g);
        x %= (b / g);
        if (x < 0) {
            x += b / g;
        }
        cout << x << endl;
    }
    return 0;
}
posted @ 2012-07-21 15:44  沐阳  阅读(224)  评论(0编辑  收藏  举报