#裴蜀定理#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);
} 
posted @ 2020-01-08 11:03  lemondinosaur  阅读(103)  评论(0编辑  收藏  举报