B - 楼下水题(扩展欧几里德)
Description
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·1018 inclusive, or to find out that such points do not exist.
Input
The 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.
Output
If the required point exists, output its coordinates, otherwise output -1.
Sample Input
Input
2 5 3
Output
6 -3
题解:
模版欧几里德;Ax+By=gcd;
找到x,y;分式两边同乘以(-c/gcd)也就是x*(-c/gcd),y*(-c/gcd);就好了;
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 typedef long long LL; 6 using namespace std; 7 void e_gcd(LL &x,LL &y,LL &d,LL a,LL b){ 8 if(!b){ 9 d=a; 10 x=1; 11 y=0;//y可以为任意数;因为b为0 12 } 13 else{ 14 e_gcd(x,y,d,b,a%b);//欧几里德; 15 LL temp=x; 16 x=y; 17 y=temp-a/b*y; 18 } 19 } 20 int main(){ 21 LL a,b,c,x,y,d; 22 while(~scanf("%lld%lld%lld",&a,&b,&c)){ 23 e_gcd(x,y,d,a,b); 24 //printf("%d %d %d\n",x,y,d); 25 if(c%d!=0)puts("-1"); 26 else printf("%lld %lld\n",x*(-c/d),y*(-c/d)); 27 } 28 return 0; 29 }