数学:
一:整除
概念:
如果 A A A 能整除 B B B 则记之为 A ∣ B A|B A∣B 即存在一个数 k ∈ Z k \in Z k∈Z 使 A k = B Ak = B Ak=B。即 B B B 是 A A A 的倍数。
性质:
1. 如果 a ∣ b , b ∣ c a|b,b|c a∣b,b∣c 那么 a ∣ c a|c a∣c 表明整除具有传递性。
2. 如果 a ∣ b , a ∣ c a|b,a|c a∣b,a∣c 那么对于任意整数对 ( x , y ) (x,y) (x,y) 满足 x ∈ Z , y ∈ Z x \in Z,y \in Z x∈Z,y∈Z 都有 a ∣ b x + c y a|bx+cy a∣bx+cy。
下面证明这两个性质。
证明性质1:
因为
a
∣
b
a|b
a∣b,所以
b
=
x
a
,
x
∈
Z
b = xa,x \in Z
b=xa,x∈Z;
因为
b
∣
c
b|c
b∣c,所以
c
=
y
b
,
y
∈
Z
c = yb,y \in Z
c=yb,y∈Z。
综上所以
c
=
y
b
c = yb
c=yb,即
c
=
y
×
(
x
a
)
=
x
y
a
c = y\times (xa) = xya
c=y×(xa)=xya。
因为
x
∈
Z
,
y
∈
Z
x \in Z,y \in Z
x∈Z,y∈Z,所以
x
y
∈
Z
xy \in Z
xy∈Z,所以
a
∣
c
a|c
a∣c。
证明性质2:
因为
a
∣
b
a|b
a∣b 所以
b
=
k
a
,
k
∈
Z
b = ka,k \in Z
b=ka,k∈Z。
因为
a
∣
c
a|c
a∣c 所以
c
=
K
a
,
K
∈
Z
c = Ka,K \in Z
c=Ka,K∈Z。
因为对于任意整数对
(
x
,
y
)
(x,y)
(x,y) 满足
x
∈
Z
,
y
∈
Z
x \in Z,y \in Z
x∈Z,y∈Z 所以
b
x
∈
Z
,
c
y
∈
Z
bx \in Z,cy \in Z
bx∈Z,cy∈Z。
综上;故:原式
b
x
+
c
y
=
k
a
x
+
K
a
y
bx + cy = kax + Kay
bx+cy=kax+Kay 合并同类项得
b
x
+
c
y
=
a
(
k
x
+
K
y
)
bx + cy = a(kx + Ky)
bx+cy=a(kx+Ky)。
因为
k
∈
Z
,
x
∈
Z
,
K
∈
Z
,
y
∈
Z
k \in Z,x \in Z,K \in Z,y \in Z
k∈Z,x∈Z,K∈Z,y∈Z,所以
k
x
∈
Z
,
K
y
∈
Z
kx \in Z,Ky \in Z
kx∈Z,Ky∈Z。
所以
k
x
+
K
y
∈
Z
kx + Ky \in Z
kx+Ky∈Z 。
至此原式得:
a
∣
a
×
(
k
x
+
K
y
)
a|a\times (kx + Ky)
a∣a×(kx+Ky)
所以,对于任意整数对
(
x
,
y
)
(x,y)
(x,y) 满足
x
∈
Z
,
y
∈
Z
x \in Z,y \in Z
x∈Z,y∈Z 都有
a
∣
b
x
+
c
y
a|bx+cy
a∣bx+cy。
证明题:
一:设 a ∣ n , b ∣ n a|n,b|n a∣n,b∣n 且存在整数 a x + b y = 1 ax + by = 1 ax+by=1,证明 a b ∣ n ab|n ab∣n。
证明:
因为
a
∣
n
,
b
∣
n
a|n,b|n
a∣n,b∣n 所以
n
=
k
a
,
n
=
K
b
,
k
∈
Z
,
K
∈
Z
n = ka,n = Kb,k \in Z,K \in Z
n=ka,n=Kb,k∈Z,K∈Z。
因为
a
x
+
b
y
=
1
ax + by = 1
ax+by=1,
所以
n
=
n
×
(
a
x
+
b
y
)
n = n\times (ax + by)
n=n×(ax+by);
即
n
=
n
a
x
+
n
b
y
n = nax + nby
n=nax+nby,
即
n
=
(
K
b
)
a
x
+
(
k
a
)
b
y
n = (Kb)ax + (ka)by
n=(Kb)ax+(ka)by,
即
n
=
K
a
b
x
+
k
a
b
y
n = Kabx + kaby
n=Kabx+kaby,
即
n
=
a
b
(
K
x
+
k
y
)
n = ab(Kx + ky)
n=ab(Kx+ky);
因为
K
∈
Z
,
x
∈
Z
,
k
∈
Z
,
y
∈
Z
K \in Z,x \in Z,k \in Z,y \in Z
K∈Z,x∈Z,k∈Z,y∈Z,
所以
K
x
∈
Z
,
k
y
∈
Z
Kx \in Z,ky \in Z
Kx∈Z,ky∈Z,
所以
K
x
+
k
y
∈
Z
Kx + ky \in Z
Kx+ky∈Z,
所以
a
b
∣
n
ab|n
ab∣n。
二:exgcd算法
形如求解
a
x
+
b
y
=
c
ax+by=c
ax+by=c 知道
a
,
b
,
c
a,b,c
a,b,c 求解整数解
x
,
y
x,y
x,y 的值。
通常使用 exgcd
算法求解。
首先考虑无整数解的情况,根据贝祖定理,对于
a
∈
Z
,
b
∈
Z
,
c
∈
Z
a\in Z,b\in Z,c\in Z
a∈Z,b∈Z,c∈Z 如果有两个整数
x
,
y
x,y
x,y 满足
a
x
+
b
y
=
c
ax+by=c
ax+by=c 那么
c
=
k
×
gcd
(
a
,
b
)
,
k
∈
Z
c=k\times\gcd(a,b),k\in Z
c=k×gcd(a,b),k∈Z。
即:如果
c
m
o
d
gcd
(
a
,
b
)
!
=
0
c\mod\gcd(a,b)!=0
cmodgcd(a,b)!=0 那么就无解。
如果有解,那么:
令
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b),
b
x
+
(
a
m
o
d
b
)
y
=
gcd
(
b
,
a
m
o
d
b
)
bx+(a\mod b)y=\gcd(b,a\mod b)
bx+(amodb)y=gcd(b,amodb)。
因为
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
b
)
\gcd(a,b)=\gcd(b,a\mod b)
gcd(a,b)=gcd(b,amodb)。
所以
a
x
+
b
y
=
b
x
+
(
a
m
o
d
b
)
y
ax+by=bx+(a\mod b)y
ax+by=bx+(amodb)y。
因为
a
m
o
d
b
=
a
−
⌊
a
/
b
⌋
×
b
a\mod b=a-\lfloor a/b\rfloor\times b
amodb=a−⌊a/b⌋×b。
所以原式为
a
x
+
b
y
=
b
x
+
(
a
−
⌊
a
/
b
⌋
×
b
)
y
ax+by=bx+(a-\lfloor a/b\rfloor\times b)y
ax+by=bx+(a−⌊a/b⌋×b)y。
化简下得:
a
x
+
b
y
=
b
x
+
a
y
−
⌊
a
/
b
⌋
b
y
ax+by=bx+ay-\lfloor a/b\rfloor by
ax+by=bx+ay−⌊a/b⌋by。
也就是
a
x
+
b
y
=
b
(
x
−
⌊
a
/
b
⌋
y
)
+
a
y
ax+by=b(x-\lfloor a/b\rfloor y)+ay
ax+by=b(x−⌊a/b⌋y)+ay。
所以
x
=
y
,
y
=
x
−
⌊
a
/
b
⌋
y
x=y,y=x-\lfloor a/b\rfloor y
x=y,y=x−⌊a/b⌋y。
但是这么做只能求出
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b) 的特解,并不能求出
a
x
+
b
y
=
c
ax+by=c
ax+by=c 的特解,但是因为贝祖定理得
c
=
k
×
gcd
(
a
,
b
)
,
k
∈
Z
c=k\times\gcd(a,b),k\in Z
c=k×gcd(a,b),k∈Z 所以将两边同时乘
c
/
gcd
(
a
,
b
)
c/\gcd(a,b)
c/gcd(a,b) 因为
c
m
o
d
gcd
(
a
,
b
)
=
0
c\mod\gcd(a,b)=0
cmodgcd(a,b)=0 所以
c
/
gcd
(
a
,
b
)
∈
Z
c/\gcd(a,b)\in Z
c/gcd(a,b)∈Z。
又因为
x
,
y
∈
Z
x,y\in Z
x,y∈Z 所以
x
×
(
c
/
gcd
(
a
,
b
)
)
∈
Z
x\times(c/\gcd(a,b))\in Z
x×(c/gcd(a,b))∈Z 同理
y
×
(
c
/
gcd
(
a
,
b
)
)
∈
Z
y\times(c/\gcd(a,b))\in Z
y×(c/gcd(a,b))∈Z。所以不用担心是不是整数的问题。
模板题:
https://www.luogu.com.cn/problem/CF7C
代码:
#include<bits/stdc++.h>
using namespace std;
typedef __int128 ll;
ll a,b,x,y,c;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}
template<typename T>inline void rd(T&r){
r=0;char c=getchar(),m=1;
for(;!isdigit(c);c=getchar()){
if(c=='-')m=-1;
}
for(;isdigit(c);c=getchar()){
r=(r<<3)+(r<<1)+(c^48);
}
r*=m;
}
template<typename T>inline void wt(T r){
if(r<0){
putchar('-');wt(-r);return;
}
if(r>9) wt(r/10);
putchar(r%10+'0');
}
int main(){
rd(a);rd(b);rd(c);
c=-c;
ll g=exgcd(a,b,x,y);
if(c%g){
puts("-1");
return 0;
}
ll t=c/g;
wt(x*t);
putchar(' ');
wt(y*t);
putchar('\n');
return 0;
}