A line on the plane is described by an equation Ax + By + C = 0. You are to find any point on this line, whose coordinates are integer numbers from - 5·1018 to 5·1018inclusive, or to find out that such points do not exist.
InputThe first line contains three integers A, B and C ( - 2·109 ≤ A, B, C ≤ 2·109) — corresponding coefficients of the line equation. It is guaranteed that A2 + B2 > 0.
If the required point exists, output its coordinates, otherwise output -1.
2 5 3
6 -3
题意:给你算式Ax + By + C = 0, 给出A, B,C,让你求出一组整数解(x,y),一定要注意怎么求的整数解的条件;
其实这个典型的扩展欧几里得算法:
形如:Ax + By = gcd(A,B); //这里的x,y和上面的题意上的x,y不一样;
B x1 + (A%B)y1 = gcd(A,B);
........
A1x2 + 0y2 = gcd(A,B);
这时候返回:
return x2 =1, y2=0;
再一直回溯; 一直求的x,y;
** 但这里求得的x,y,是 Ax + By = gcd(A,B); 这个算式的x,y;
我们要求的是 Ax1 + By1 = -C,的x1,y1;
所以我们把 Ax + By = gcd(A,B); 变一下形;
A(x/gcd(A,B)) + B(y/gcd(A,B)) = 1;
A(x*(-c)/gcd(A,B)) + B(y*(-c)/gcd(A,B)) = -C;
x1 = x *(-c)/gcd(A,B);
y1 = y*(-c)/gcd(A,B);
有上述知道,x1,y1,要想是整数,就必须 让(-c)%gcd(A,B) == 0;
这样x1,y1,才会是整数;
一般为了防止溢出:求x1,y1 时,这样写
x1 = (-c)/gcd(A,B)*x;
y1 = (-c)/gcd(A,B)*y;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll kz_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
long long tt;
tt = kz_gcd(b,a%b,x,y);
ll temp = y;
y = x-(a/b)*y;
x = temp;
return tt;
}
int main()
{
ll i,j,a,b,c;
while(~scanf("%lld%lld%lld",&a,&b,&c))
{
ll x,y;
ll g = kz_gcd(a,b,x,y);
if(-c%g!=0)
printf("-1\n");
else printf("%lld %lld\n",(-c)/g*x,(-c)/g*y);
}
return 0;
}