7C. Line【拓展歐幾里得】 數論模板
阿新 • • 發佈:2019-01-29
C. Line
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
If the required point exists, output its coordinates, otherwise output -1.
Sample test(s) input2 5 3output
6 -3
暫時不是特別明白運算的原理,不過還是要先記住...........
#include<cstdio> typedef long long ll; ll gcd(ll a,ll b) { if(b==0) { return a; } return gcd(b,a%b); } void extgcd(ll a,ll b,ll& d,ll& x,ll& y) { if(!b) { d=a;x=1;y=0; } else { extgcd(b,a%b,d,y,x); y-=x*(a/b); } } int main() { ll a,b,c; while(~scanf("%lld%lld%lld",&a,&b,&c)) { ll tp=gcd(a,b); if(c%tp!=0)//不能整除的 { printf("-1\n"); } else { ll x,y,d; extgcd(a,b,d,x,y); printf("%lld %lld\n",-x*c/tp,-y*c/tp); } } return 0; }
2016年6月22日7:43
之前的做法雖然能ac,但是總感覺心裡不踏實,只有這樣找出所有解的情況,再進行判斷,這樣才更嚴謹
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; const ll maxn=5e18; ll abs(ll x) { return x<0?-x:x; } ll gcd(ll a,ll b) { if(b==0) { return a; } return gcd(b,a%b); } void extgcd(ll a,ll b,ll &m,ll &x,ll &y) { if(b==0) { m=a;x=1;y=0; return; } extgcd(b,a%b,m,y,x); y-=(a/b)*x; } bool judge(ll a,ll b)//在範圍內 { return a<=maxn&&a>=-maxn && b<=maxn&&b>=-maxn; } void slove(ll a,ll b,ll c) { ll x,y,m; extgcd(a,b,m,x,y); c=-c; if(c%m!=0) { printf("-1\n"); return; } x*=c/m;y*=c/m; if(a==0||b==0) { printf("%I64d %I64d\n",x,y); return; } ll lcm=a/m*b; ll tx=lcm/a,ty=lcm/b; ll tp=abs((x+maxn)/lcm+1); x=x-tp*(lcm/a); y=y+tp*(lcm/b); while(x<=maxn) { if(judge(x,y)) { printf("%I64d %I64d\n",x,y); //printf("%lld\n",a*x+b*y); return; } x+=tx;y-=ty; } printf("-1\n"); } int main() { ll a,b,c; while(~scanf("%I64d%I64d%I64d",&a,&b,&c)) { slove(a,b,c); } return 0; }