暂时不是特别明白运算的原理,不过还是要先记住...........
#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;
}