美文网首页
扩展欧几里得

扩展欧几里得

作者: MMatx | 来源:发表于2019-03-23 21:44 被阅读0次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>

using namespace std;
void exgcd(int a,int b,int &x,int &y,int &d)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
        return ;
    }
    exgcd(b,a%b,y,x,d);
    y-=(a/b)*x;
}
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        int x=0,y=0,d=0;
        exgcd(a,b,x,y,d);
        if(d!=1)
        {
            cout<<"sorry"<<endl;
            continue;
        }
        if(x<0)
        {
            for(int i=0;; i++)
            {
                x+=b;
                y-=a;
                if(x>0)
                    break;
            }
        }
        else
        {
            for(int i=0;; i++)
            {
                x-=b;
                y+=a;
                if(x<0)
                    break;
            }
            x+=b;
            y-=a;
        }
        cout<<x<<" "<<y<<endl;
    }

}

https://vjudge.net/problem/HDU-2669

1.最大公约数在d中
2.解释
求整数x, y使得ax + by = 1, 如果gcd(a, b) != 1, 我们很容易发现原方程是无解的。则方程ax + by = 1有正整数对解(x, y)的必要条件是gcd(a, b) = 1,即a, b 互质。

此时正整数对解(x, y)可以通过扩展欧几里得算法求得。

对于方程ax + by = gcd(a, b);我们设解为x1, y1

我们令a = b, b = a % b;

得到方程bx + a % by = gcd(b, a % b);

由欧几里得算法可以得到gcd(a, b) = gcd(b, a % b);

代入可得:bx + a % b y = gcd(a, b)

设此方程解为x2, y2;
3.通解
对于已经得到的解x1, y1;我们便可以求出通解。

我们设x = x1 + kt;t为整数

带入方程解得y = y1 - a * k / b * t;

而我们要保证y也为整数的话必须保证a * k /b也为整数,我们不妨令k = b/gcd(a, b);

所以通解为:

x = x1 + b / gcd(a, b) * t;

y = y1 - a / gcd(a, b) * t;

相关文章

  • 扩展欧几里得算法

    资料 欧几里得算法 扩展欧几里得算法 扩展欧几里得算法应用 欧几里得算法 欧几里得算法用于求两个数的最大公约数 证...

  • 扩展欧几里得算法

    扩展欧几里得算法(Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)的扩展...

  • 扩展欧几里得

    https://vjudge.net/problem/HDU-2669 1.最大公约数在d中2.解释求整数x, y...

  • 算法学习(2)----丢番图方程

    之前一篇随笔"算法学习(1)----扩展欧几里得算法"记录了对朴素欧几里得算法和扩展欧几里得算法的学习和认识...

  • 扩展欧几里德算法

    扩展欧几里得算法(英语:Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)...

  • 组合数求解

    扩展欧几里得算法原理求解逆元的方法(本文采用扩展欧几里得算法进行求解)求组合数的两种方法Lucas定理

  • 欧几里得算法

    广义欧几里得除法:(求最大公因数) 欧几里得的定理: gcd(a, b) = gcd(b , a%b) 扩展欧几里...

  • 欧几里得扩展-逆元求解

    核心公式:xa + yb = gcd(a,b) 逆元为上述公式的特殊情况(gcd(a,b)== 1,a和b互为质数...

  • 模板-->扩展欧几里得

    如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 单变元模线性方程模板 poj_211...

  • 扩展欧几里得算法

    欧几里得算法 文中用 表示求模运算, 表示整除, 比如 欧几里德算法(称辗转相除法),用于计算两个整数a, b的...

网友评论

      本文标题:扩展欧几里得

      本文链接:https://www.haomeiwen.com/subject/iyyevqtx.html