题面描述
解不定方程Ax+By=K(得到的x和y只是其中一组解)
给出A、B、K,求出x和y,满足Ax+By=K。
【输入格式】
一行三个整数 A,B,K。 1 ≤ A,B,K ≤ 10^9
【输出格式】
一行两个整数 x,y。如果无解,输出"no solution!"
思路
在 欧 几 里 得 算 法 中 , 当 b = 0 时 , 显 然 存 在 一 对 整 数 解 x = 1 , y = 0 , 使 得 a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) . 在欧几里得算法中,当b=0时,显然存在一对整数解x=1,y=0, 使得a*1+0*0=gcd(a,0). 在欧几里得算法中,当b=0时,显然存在一对整数解x=1,y=0,使得a∗1+0∗0=gcd(a,0).
令
a
x
+
b
y
=
g
c
d
(
a
,
b
)
令ax+by=gcd(a,b)
令ax+by=gcd(a,b)
∵
g
c
d
(
b
,
a
m
o
d
b
)
=
g
c
d
(
a
,
b
)
;
\because gcd(b,a~mod ~b)=gcd(a,b);
∵gcd(b,a mod b)=gcd(a,b);
∴
a
∗
x
+
b
∗
y
=
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
=
b
∗
t
x
+
(
a
m
o
d
b
)
∗
t
y
\therefore a*x+b*y=gcd(a,b)=gcd(b,a~mod ~b)=b*tx+(a~mod~b)*ty
∴a∗x+b∗y=gcd(a,b)=gcd(b,a mod b)=b∗tx+(a mod b)∗ty
∵
a
m
o
d
b
=
a
−
⌊
a
/
b
⌋
∗
b
\because a ~mod~ b=a- \left\lfloor a/b \right\rfloor*b
∵a mod b=a−⌊a/b⌋∗b
∴
a
∗
x
+
b
∗
y
=
b
∗
t
x
+
(
a
−
⌊
a
/
b
⌋
∗
b
)
∗
t
y
\therefore a*x+b*y=b*tx+(a- \left\lfloor a/b \right\rfloor*b)*ty
∴a∗x+b∗y=b∗tx+(a−⌊a/b⌋∗b)∗ty
∴
a
∗
x
+
b
∗
y
=
a
∗
t
y
+
b
∗
(
t
x
−
⌊
a
/
b
⌋
∗
t
y
)
\therefore a*x+b*y=a*ty+b*(tx-\left\lfloor a/b \right\rfloor*ty)
∴a∗x+b∗y=a∗ty+b∗(tx−⌊a/b⌋∗ty)
∴
x
=
t
y
,
y
=
t
x
−
⌊
a
/
b
⌋
∗
t
y
\therefore x=ty,y=tx-\left\lfloor a/b \right\rfloor*ty
∴x=ty,y=tx−⌊a/b⌋∗ty
再用数学归纳法进行证明即可。
由于本题
K
K
K不一定等同于
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b),因此我们要先求到
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b),后逆推得
x
,
y
x,y
x,y,判断一下
K
K
K是否被
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)整除,再
x
=
x
∗
k
/
d
x=x*k/d
x=x∗k/d,
y
=
(
k
−
a
∗
x
)
/
b
y=(k-a*x)/b
y=(k−a∗x)/b
代码
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1;y=0;
return a;
}
else
{
ll tx,ty;
ll d=exgcd(b,a%b,tx,ty);
x=ty;y=tx-(a/b)*ty;
return d;
}
}
int main()
{
ll a,b,k,x,y;scanf("%lld%lld%lld",&a,&b,&k);
ll d=exgcd(a,b,x,y);
if(k%d){puts("no solution!");return 0;}
else
{
x=x*k/d;
y=(k-a*x)/b;
}
printf("%lld %lld\n",x,y);
return 0;
}