zoukankan      html  css  js  c++  java
  • 扩展欧几里德

    对于不完全为0的非负整数a, b.  gcd(a, b)表示a, b 的最大公约数。那么存在整数x y使得 gcd(a, b) = a * x + b * y;

    不妨设a > b

     ,当b = 0 时,gcd(a, b) = a , 此时 x = 1, y = 0;

     ,当 a * b <> 0 时,

      a * x + b * y = gcd(a, b);   (1)

        b * x0 + (a % b) * y0 = gcd( b, a % b);   (2)

    由朴素的欧几里德公式; gcd(a, b) = gcd (b, a % b);

    (1)(2)  a * x + b * y = b * x0 + (a % b) * y0

                         = b * x0 + (a – a / b * b) * y0               

                         = a * y0 + ( x0 – a / b * y0 ) * b

              所以 x = y0, y = x0 – a / b * y0;

    void extend_euild(int a, int b)
    {
        if(b == 0)
        {
            t = 1;
            p = 0;
            c = a;
        }
        else {
            extend_euild(b, a%b);
            int temp = t;
            t = p;
            p = temp - a/b*p;
        }
    }
  • 相关阅读:
    POJ2253Frogger
    POJ3982The Fibonacci sequence
    POJ3259Wormholes
    POJ1062Expensive dowry
    POJ1860Currency Exchange
    POJ1789Truck History .
    POJ2602Superlong sums
    POJ1125Stockbroker Grapevine
    POJ2485Highways
    POJ2240Arbitrage
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/5769757.html
Copyright © 2011-2022 走看看