扩展欧几里得算法(欧几里得算法即辗转相除法)
裴蜀定理:有一对正整数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;
}
来源:CSDN
作者:ai_XZP_master
链接:https://blog.csdn.net/qq_27262727/article/details/104588011