#裴蜀定理#CF7C Line

题目

给定三个整数\(a,b,c\),问是否能找到两个数\(x,y\)使得\(ax+by+c=0\),没有则输出-1


分析

先把式子转换成\(ax+by=-c\)
然后\(x,y\)是整数当且仅当\(ax+by=gcd(a,b)\)
那么\(gcd(a,b)|-c\)
通过扩欧算出\(ax+by=gcd(a,b)\)的情况
如果\(gcd(a,b)\)不是\(-c\)的约数,那么方程无解
否则将\(x,y\)分别扩大\(-\frac{c}{gcd(a,b)}\)倍即为答案


代码

#include <cstdio>
#define rr register
using namespace std;
int a,b,c,gcd,x,y; long long xx,yy;
inline signed exgcd(int a,int b,int &x,int &y){
    if (!b) {
        x=1,y=0;
        return a;
    }else{
        rr int now=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return now;
    }
}
signed main(){
    scanf("%d%d%d",&a,&b,&c),c=-c;
    gcd=exgcd(a,b,x,y);
    if (c%gcd) return !printf("-1");
    xx=1ll*x*(c/gcd),yy=1ll*y*(c/gcd);
    return !printf("%lld %lld",xx,yy);
} 

猜你喜欢

转载自www.cnblogs.com/Spare-No-Effort/p/12165465.html
今日推荐