题意
给定直线 a x + b y + c = 0 ax + by + c = 0 ax+by+c=0,其中 a , b ≠ 0 a,b \not = 0 a,b=0,求直线上任意满足 ( x , y ) (x,y) (x,y) 为整数的点。
思路
移项得
a
x
+
b
y
=
−
c
ax + by = -c
ax+by=−c
考虑 exgcd 只要求
a
,
b
>
0
a,b > 0
a,b>0 对
c
c
c 的符号并无要求,则直接带入即可
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y;
int exgcd(int a,int b) {
if(!b) {
x = 1;
y = 0;
return a;
}
int d = exgcd(b,a % b);
int t = x;
x = y;
y = t - (a / b) * y;
return d;
}
signed main() {
int a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
c = -c;
int a2 = 1,b2 = 1;
if(a < 0) a = -a,a2 = -a2;
if(b < 0) b = -b,b2 = -b2;
int d = exgcd(a,b);
if(c % d) {
printf("-1\n");
return 0;
}
x *= c / d,y *= c / d;
printf("%lld %lld\n",x * a2,y * b2);
return 0;
}