zoukankan      html  css  js  c++  java
  • POJ2115 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;
    }
  • 相关阅读:
    solr 的全量更新与增量更新
    solr 服务器的搭建
    Mysql 问题
    App 微信支付
    App 支付宝支付
    Linux 常见命令
    [备注] 钉钉使用教程
    PARAMETER和ARGUMENT的区别
    无界面浏览器
    URLs ...
  • 原文地址:https://www.cnblogs.com/Lyush/p/2602374.html
Copyright © 2011-2022 走看看