codeforces 7c 扩展欧几里得

题意:输入a,b,c,求方程ax + by + c = 0的解,不存在输出-1

题解:扩展欧几里得的变式,ex_gcd想完全理解不太容易,需要数论的基础,我们目前只要会用就行。

ax + by = gcd(a,b),一定存在x,y使这个式子成立.

模板所做的就是:输入a,b。得到x,y以及gcd(a,b)。

再看原题,移项得 ax + by = -c,把右边变成gcd(a,b) 得

\frac{a*cx}{gcd(a,b)} + \frac{b*cx}{gcd(a,b)} = gcd(a,b)

于是新的x = cx/gcd, y = cx/gcd

#include <bits/stdc++.h>
long long gcd(long long a, long long b, long long &x, long long &y){
    long long d = a;
    if(b != 0){
        d = gcd(b, a % b, y, x);
        y -= (a / b) * x;
    }
    else{
        x = 1;
        y = 0;
    }
    return d;
}
int main(){
    long long a, b, c, d, x, y;
    scanf("%lld %lld %lld", &a, &b, &c);
    d = gcd(a, b, x, y);
    c = -c;
    if(c % d != 0)
        printf("-1\n");
    else
        printf("%lld %lld\n", x * c / d, y * c / d);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86528447