扩展欧几里得算法

我怕爱的太早我们不能终老 提交于 2020-03-01 12:21:43

扩展欧几里得算法(欧几里得算法即辗转相除法)

裴蜀定理:有一对正整数a, b,那么一定存在整数x, y,使得 ax + by = (a, b)最大公约数。

举例:存在ax + by = d,则d是a和b的最大公约数的倍数。

Example

给定nn对正整数ai,biai,bi,对于每对数,求出一组xi,yixi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)ai∗xi+bi∗yi=gcd(ai,bi)。

输入格式

第一行包含整数n。

接下来n行,每行包含两个整数ai,biai,bi。

输出格式

输出共n行,对于每组ai,biai,bi,求出一组满足条件的xi,yixi,yi,每组结果占一行。

本题答案不唯一,输出任意满足条件的xi,yixi,yi均可。

数据范围

1≤n≤1051≤n≤105,
1≤ai,bi≤2∗1091≤ai,bi≤2∗109

输入样例:

2
4 6
8 18

输出样例:

-1 1
-2 1
//欧几里得算法
#include <iostream>

using namespace std;

int exgcd(int a, int b, int &x, int &y)
{
    //return b ? gcd(b, b % a) : a;
    if (!b) //如果b = 0,ax + by = a
    {
        //得到一组解
        x = 1, y = 0;
        return a;//如果b = 0,返回a
    }
    //by + (a mod b)x = (a, b)最大公约数d
    int d = exgcd(b, a % b, y, x);//存下最大公约数,翻转了一下
    //a mod b = a - (a / b)下取整 * b带入
    //by + (a - (a / b)下取整 * b)x = d;
    //展开整理:ax + b (y - (a/b)*x)
    //得到a的系数不变为a,y的系数变成:y - (a/b)*x
    y -= a / b * x;
    
    return d;
    
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while ( n --)
    {
        int a, b, x, y;
        scanf ("%d%d", &a, &b);
        
        exgcd(a, b, x, y);
        
        printf("%d %d\n", x, y);
    }
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!