- 题意是很简单的,找直线穿过的整点存在与否,存在则输出其中任意一个解,否则输出 -1 ,注意数据范围即可。需要用到以下两个简单的数论知识。
- 裴蜀定理
方程: 中, 均是整数,则方程有整数解 的充要条件是 , 也是整数。
- 扩展欧几里德算法
考虑方程: 。
不妨设 ,当 时, ,令 即可。
当 时,由朴素欧几里德算法有
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
ll r = exgcd(b, a%b, x, y);
ll t = y;
y = x - (a/b) * y;
x = t;
return r;
}
-
移项求解时注意符号和 除以0 错误即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll A,B,C;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
ll r = exgcd(b, a%b, x, y);
ll t = y;
y = x - (a/b) * y;
x = t;
return r;
}
int main(){
ll x,y;
int suc=1;
cin>>A>>B>>C;
if(B==0){
if(-C%A==0){
x=-C/A;
y=0;
}
else
suc=0;
}
else if(A==0){
if(-C%B==0){
y=-C/B;
x=0;
}
else
suc=0;
}
else{
ll g=exgcd(A,B,x,y);
if(-C%g==0){
ll k=-C/g;
x*=k;
y*=k;
}
else
suc=0;
}
if(suc){
cout<<x<<" "<<y<<"\n";
}
else
cout<<-1<<endl;
}
66