扩展欧几里得(acwing877)

给a,b求使ax+by=gcd(a,b),成立的x,y;

思路:

整个过程可以分为两部分,一部分是求gcd(a,b),当函数递归回来时,求x,y;

递归回来时: b*y+(a-(a/b)*b)*x=d(d为gcd(a,b));

求当前a*x+b*y=d,的x,y;

a*x+b(y-a/b*x)=d;

x=x;

y=y-a/b*x;

代码:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define  per(i,a,b)  for(int i=a;i<=b;i++) 
const int N = 1e5 + 100;
LL n, k;
int exgcd(int a, int b, int& x, int & y)
{
    if (!b)//a*1+b*0=a;
    {
        x = 1;
        y = 0;
        return a;
    }
     int d=exgcd(b, a % b, y, x);//逆转x,y方便求递归回来时x,y
    y = y - (a / b)*x;
    return d;

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

你可能感兴趣的:(数论,算法)