模意义下的数和运算
一共有12个苹果,平分给5个小朋友,最后会剩下几个苹果?
12➗5 = 2…2
第一个2叫商,可以用12/5得到,第二个2叫余数,可以用12%5得到,%叫做模,也就是mod
定义1:模
对于整数a,b,满足b>0,则存在唯一的整数q,r,满足 a = b q + r a=bq+r a=bq+r,其中 0 ≤ r < b 0\leq r<b 0≤r<b 。其中称q为商、r为余数。余数用a mod b或者a%b来表示
1. ( a + b ) % M = ( a % M + b % M ) % M (a+b)\% M=(a\% M+b\% M)\% M (a+b)%M=(a%M+b%M)%M
将a个苹果分给小朋友剩下2个苹果,将b个苹果分给小朋友剩下3个苹果,那么将a+b个苹果分给小朋友剩下的苹果数量,等于把5个苹果分给小朋友剩下的数量
2. ( a − b ) % M = ( a % M − b % M ) % M (a-b)\% M=(a\% M-b\% M)\% M (a−b)%M=(a%M−b%M)%M
即使有 a ≥ b a\geq b a≥b,但是也不能保证 a % M ≥ b % M a\% M\geq b\% M a%M≥b%M,所以这种情况下我们可以优化
( a − b ) % M = ( a % M − b % M + M ) % M (a-b)\% M=(a\% M-b\% M+M)\% M (a−b)%M=(a%M−b%M+M)%M
3.
(
a
×
b
)
%
M
=
(
a
%
M
×
b
%
M
)
%
M
(a\times b)\% M=(a\% M\times b\% M)\% M
(a×b)%M=(a%M×b%M)%M
∃
a
=
x
a
M
+
r
a
,
b
=
x
b
M
+
r
b
∴
r
a
=
a
%
M
,
r
b
=
b
%
M
a
×
b
=
x
a
x
b
M
M
+
x
b
r
a
M
+
x
a
r
b
M
+
r
a
r
b
∴
a
×
b
=
(
x
a
x
b
M
+
r
a
x
b
+
r
b
x
a
)
M
+
r
a
r
b
∵
x
/
M
×
M
+
(
x
%
M
)
=
x
∴
r
a
r
b
=
r
a
r
b
/
M
×
M
+
r
a
r
b
%
M
∴
a
×
b
=
(
x
a
x
b
M
+
r
a
x
b
+
r
b
x
a
+
r
a
r
b
/
M
)
M
+
r
a
r
b
%
M
∵
a
%
M
%
M
=
a
%
M
∴
(
a
×
b
)
%
M
=
(
r
a
×
r
b
)
%
M
\exists a=x_aM+r_a,b=x_bM+r_b\\ \therefore r_a=a\%M,r_b=b\%M\\ a\times b=x_ax_bMM+x_br_aM+x_ar_bM+r_ar_b\\ \therefore a\times b=(x_ax_bM+r_ax_b+r_bx_a)M+r_ar_b\\ \because x/M\times M+(x\%M)=x\\ \therefore r_ar_b=r_ar_b/M\times M+r_ar_b\%M\\ \therefore a\times b=(x_ax_bM+r_ax_b+r_bx_a+r_ar_b/M)M+r_ar_b\%M\\ \because a\%M\%M=a\%M\\ \therefore (a\times b)\%M=(r_a\times r_b)\%M
∃a=xaM+ra,b=xbM+rb∴ra=a%M,rb=b%Ma×b=xaxbMM+xbraM+xarbM+rarb∴a×b=(xaxbM+raxb+rbxa)M+rarb∵x/M×M+(x%M)=x∴rarb=rarb/M×M+rarb%M∴a×b=(xaxbM+raxb+rbxa+rarb/M)M+rarb%M∵a%M%M=a%M∴(a×b)%M=(ra×rb)%M
除法不成立
所有数mod b只有b种可能,分别是0,1,…,b-1,所以可以把所有整数分为b种类型
如果两个数mod b的结果相同,就分为同一类,叫做同余。
定义2:同余
若两数x,y除以b的余数相等,则称x,y模b同余,记作 x ≡ y ( m o d b ) x\equiv y(\mod b) x≡y(modb)
同余的性质:
1.反身性: x ≡ x ( m o d M ) x\equiv x(\mod M) x≡x(modM)
2.对称性:若 x ≡ y ( m o d M ) x\equiv y(\mod M) x≡y(modM),则 y ≡ x ( m o d M ) y\equiv x(\mod M) y≡x(modM)
3.传递性:若 x ≡ y ( m o d M ) , y ≡ z ( m o d M ) x\equiv y(\mod M),y\equiv z(\mod M) x≡y(modM),y≡z(modM),则 x ≡ z ( m o d M ) x\equiv z(\mod M) x≡z(modM)
4.同加性:若 x ≡ y ( m o d M ) x\equiv y(\mod M) x≡y(modM),则 x + z ≡ y + z ( m o d M ) x+z\equiv y+z(\mod M) x+z≡y+z(modM)
5.同乘性:若 x ≡ y ( m o d M ) x\equiv y(\mod M) x≡y(modM),则 x × z ≡ y × z ( m o d M ) x\times z\equiv y\times z(\mod M) x×z≡y×z(modM)
6.同幂性:若 x ≡ y ( m o d M ) x\equiv y(\mod M) x≡y(modM),则 x z ≡ y z ( m o d M ) x^z\equiv y^z(\mod M) xz≡yz(modM)
7.
x
≡
y
(
m
o
d
M
)
⟺
b
∣
(
x
−
y
)
x\equiv y(\mod M)\Longleftrightarrow b|(x-y)
x≡y(modM)⟺b∣(x−y)
12
%
5
=
2
22
%
5
=
2
∴
22
≡
12
(
m
o
d
5
)
多出来的
22
−
12
=
10
个苹果平分给了
5
个小朋友
每个小朋友多分到了
2
个苹果,一共多了
2
×
5
=
10
个苹果
如果每个小朋友多分到
x
个苹果,那么一共多了
5
x
个苹果,并且
5
一定是
5
x
的约数
所以可以表示成
:
5
∣
(
22
−
12
)
12\%5=2\\ 22\%5=2\\ \therefore 22\equiv12(\mod5)\\ 多出来的22-12=10个苹果平分给了5个小朋友\\ 每个小朋友多分到了2个苹果,一共多了2\times5=10个苹果\\ 如果每个小朋友多分到x个苹果,那么一共多了5x个苹果,并且5一定是5x的约数\\ 所以可以表示成:5|(22-12)
12%5=222%5=2∴22≡12(mod5)多出来的22−12=10个苹果平分给了5个小朋友每个小朋友多分到了2个苹果,一共多了2×5=10个苹果如果每个小朋友多分到x个苹果,那么一共多了5x个苹果,并且5一定是5x的约数所以可以表示成:5∣(22−12)
定义3:不定方程
不定方程:通常涉及两个或者更多未知数的多项式方程,求解尽在整数范围内进行
在本节中,只需要考虑 a x + b y = c ax+by=c ax+by=c的二元一次方程
定理1:裴蜀定理
裴蜀定理:对于整数a,b,设它们的最大公约数 g c d ( a , b ) = d gcd(a,b)=d gcd(a,b)=d,一定存在一组整数(x,y)使得 a x + b y = d ax+by=d ax+by=d
那么如何通过裴蜀定理来解决一般的 a x + b y = c ax+by=c ax+by=c的不定方程问题?
定理2:拓展欧几里得算法
对于整数a,b,c,
a
x
+
b
y
=
c
ax+by=c
ax+by=c有整数解,当且仅当
g
c
d
(
a
,
b
)
∣
c
gcd(a,b)|c
gcd(a,b)∣c时成立
充分性
:
若
c
为
g
c
d
(
a
,
b
)
的倍数,那么可以先通过裴蜀定理找到一组
(
x
,
y
)
使得
a
x
+
b
y
=
g
c
d
(
a
,
b
)
然后将
x
,
y
同时乘以
c
g
c
d
(
a
,
b
)
(
必然为整数
)
就能得到
a
x
+
b
y
=
c
的一组解
必要性
:
若不定方程有解,则
a
=
t
×
g
c
d
(
a
,
b
)
,
b
=
p
×
g
c
d
(
a
,
b
)
a
x
+
b
y
=
t
×
g
c
d
(
a
,
b
)
×
x
+
p
×
g
c
d
(
a
,
b
)
×
y
=
g
c
d
(
a
,
b
)
×
(
t
x
+
p
y
)
=
m
×
g
c
d
(
a
,
b
)
∴
g
c
d
(
a
,
b
)
∣
c
充分性:\\ 若c为gcd(a,b)的倍数,那么可以先通过裴蜀定理找到一组(x,y)使得ax+by=gcd(a,b)\\ 然后将x,y同时乘以\frac{c}{gcd(a,b)}(必然为整数)\\ 就能得到ax+by=c的一组解\\ 必要性:\\ 若不定方程有解,则\\ a=t\times gcd(a,b),b=p\times gcd(a,b)\\ ax+by=t\times gcd(a,b)\times x+p\times gcd(a,b)\times y=gcd(a,b)\times(tx+py)=m\times gcd(a,b)\\ \therefore gcd(a,b)|c
充分性:若c为gcd(a,b)的倍数,那么可以先通过裴蜀定理找到一组(x,y)使得ax+by=gcd(a,b)然后将x,y同时乘以gcd(a,b)c(必然为整数)就能得到ax+by=c的一组解必要性:若不定方程有解,则a=t×gcd(a,b),b=p×gcd(a,b)ax+by=t×gcd(a,b)×x+p×gcd(a,b)×y=gcd(a,b)×(tx+py)=m×gcd(a,b)∴gcd(a,b)∣c
所以我们只需要考虑
a
x
+
b
y
=
g
c
d
(
a
,
b
)
=
d
ax+by=gcd(a,b)=d
ax+by=gcd(a,b)=d的一组解就可以了
我们可以使用扩展欧几里得算法(exgcd)
欧几里得算法求出a,b的最大公约数
1.当b=0时,a,b的最大公约数就是a
2.求出b,a mod b的最大公约数,设为g0
3.令g=g0,g就是a,b的最大公约数
仿照这个过程,来求解不定方程
1.当b=0时, a x + b y = d ax+by=d ax+by=d的解为 x = d a x=\frac{d}{a} x=ad,y任意
2.求出 b x + ( a m o d b ) y = d bx+(a\mod b)y=d bx+(amodb)y=d的一组解,设为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)
3.令 ( x , y ) = f ( ( x 0 , y 0 ) ) (x,y)=f((x_0,y_0)) (x,y)=f((x0,y0)),那么(x,y)就是ax+by=d的一组解。其中f((a,b))指的是将一对数(a,b)做一种变换
那么问题在于如何将(x0,y0)生成一个新的(x,y)
已知
:
b
x
0
+
(
a
m
o
d
b
)
y
0
=
d
∵
a
m
o
d
b
=
a
−
a
/
b
×
b
∴
b
x
0
+
(
a
−
a
/
b
×
b
)
y
0
=
d
∴
a
y
0
+
b
(
x
0
−
a
/
b
×
y
0
)
=
d
已知:\\ bx_0+(a\mod b)y_0=d\\ \because a\mod b=a-a/b\times b\\ \therefore bx_0+(a-a/b\times b)y_0=d\\ \therefore ay_0+b(x_0-a/b\times y_0)=d\\
已知:bx0+(amodb)y0=d∵amodb=a−a/b×b∴bx0+(a−a/b×b)y0=d∴ay0+b(x0−a/b×y0)=d
所以只要令
(
x
,
y
)
=
(
y
0
,
x
0
−
a
/
b
×
y
0
)
(x,y)=(y_0,x_0-a/b\times y_0)
(x,y)=(y0,x0−a/b×y0),就可以解决不定方程问题
求解 16 x + 6 y = g c d ( 16 , 6 ) = 2 16x+6y=gcd(16,6)=2 16x+6y=gcd(16,6)=2的一组整数解,并求出所有整数解
void exgcd(int a,int b,int &x,int &y){ //求解ax+by=gcd(a,b)
if(b==0){
x=1,y=0;
//此时gcd(a,b)=gcd(a,0)=a,a*1+0*0=a
return ;
}
exgcd(b,a%b,y,x);
//求解bx0+(a%b)y0=gcd(b,a%b)
//执行完这个语句后暂时x=y0,y=x0
y-=a/b*x;
//y=x0-a/b*y0
}
求解 16 x + 6 y = 2 求解 6 x + ( 16 % 6 ) = 6 x + 4 y = 2 求解 4 x + ( 6 % 4 ) y = 4 x + 2 y = 2 求解 2 x + ( 4 % 2 ) y = 2 x + 0 y = 2 x 0 = 1 , y 0 = 0 x 1 = y 0 = 0 , y 1 = x 0 − 4 / 2 y 0 = 1 x 2 = y 1 = 1 , y 2 = x 1 − 6 / 4 y 1 = − 1 x 3 = y 2 = − 1 , y 3 = x 2 − 16 / 6 y 2 = 3 求解16x+6y=2\\ \qquad \qquad \qquad \qquad 求解6x+(16\%6)=6x+4y=2\\ \qquad \qquad \qquad \qquad \qquad 求解4x+(6\%4)y=4x+2y=2\\ \qquad \qquad \qquad \qquad \qquad \qquad 求解2x+(4\%2)y=2x+0y=2\\ \qquad \qquad \qquad \qquad \qquad \qquad x_0=1,y_0=0\\ \qquad \qquad \qquad \qquad \qquad \qquad x_1=y_0=0,y_1=x_0-4/2y_0=1\\ \qquad \qquad \qquad \qquad \qquad x_2=y_1=1,y_2=x_1-6/4y_1=-1\\ \qquad \qquad \qquad \qquad x_3=y_2=-1,y_3=x_2-16/6y_2=3 求解16x+6y=2求解6x+(16%6)=6x+4y=2求解4x+(6%4)y=4x+2y=2求解2x+(4%2)y=2x+0y=2x0=1,y0=0x1=y0=0,y1=x0−4/2y0=1x2=y1=1,y2=x1−6/4y1=−1x3=y2=−1,y3=x2−16/6y2=3
由此求出 16 x + 6 y = 2 16x+6y=2 16x+6y=2的一组解: x = − 1 , y = 3 x=-1,y=3 x=−1,y=3
现在已经求出了一组解,那么如何求出所有解呢?
假设这个不定方程还有一组解 ( x ′ , y ′ ) (x',y') (x′,y′),那么就有 a x ′ + b y ′ = c ax'+by'=c ax′+by′=c,就可以得到 a ( x ′ − x ) + b ( y ′ − y ) = 0 a(x'-x)+b(y'-y)=0 a(x′−x)+b(y′−y)=0
设 Δ x = x ′ − x , Δ y = y ′ − y \Delta x=x'-x,\Delta y=y'-y Δx=x′−x,Δy=y′−y,那么一定满足 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0,
同时对于不定方程 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0的任何一组解 ( Δ x , Δ y ) (\Delta x,\Delta y) (Δx,Δy), a ( x + Δ x ) + b ( y + Δ y ) = ( a x + b y ) + ( a Δ x + b Δ y ) = c + 0 = c a(x+\Delta x)+b(y+\Delta y)=(ax+by)+(a\Delta x+b\Delta y)=c+0=c a(x+Δx)+b(y+Δy)=(ax+by)+(aΔx+bΔy)=c+0=c
( x + Δ x , y + Δ y ) (x+\Delta x,y+\Delta y) (x+Δx,y+Δy)也一定是原不定方程的一组解
所以只需要求出 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0的所有解,再将这些解加上原来求出的特解,就可以得到原不定方程的所有解
首先求出 a x + b y = 0 ax+by=0 ax+by=0的最小一组非零解 ( x m i n , y m i n ) (x_{min},y_{min}) (xmin,ymin)(指绝对值最小),考虑 a x + b y = 0 ax+by=0 ax+by=0,则 ∣ a x ∣ = ∣ b y ∣ |ax|=|by| ∣ax∣=∣by∣,那么 ∣ a x ∣ |ax| ∣ax∣或者说 ∣ b y ∣ |by| ∣by∣,一定同时是a,b的倍数,想让|x|尽量小,也就是让a,b的公倍数尽量小,最小就是a,b的最小公倍数 l c m ( a , b ) = a × b / g c d ( a , b ) lcm(a,b)=a\times b/gcd(a,b) lcm(a,b)=a×b/gcd(a,b)。
所以最小的一组非零解就是 ( x m i n , y m i n = ( b g c d ( a , b ) ) , − a g c d ( a , b ) ) (x_{min},y_{min}=(\frac{b}{gcd(a,b)}),\frac{-a}{gcd(a,b)}) (xmin,ymin=(gcd(a,b)b),gcd(a,b)−a)
于是我们就可以求出形如 a x + b y = c ax+by=c ax+by=c的方程的所有解了。对于本样例不定方程来说, a x + b y = 0 ax+by=0 ax+by=0的最小的一组非零解是 x ′ = 3 , y ′ = − 8 x'=3,y'=-8 x′=3,y′=−8。所以 16 x + 6 y = 2 16x+6y=2 16x+6y=2的所有解就是 x = − 1 + 3 k , y = 3 − 8 k x=-1+3k,y=3-8k x=−1+3k,y=3−8k
如果想要求出 16 x + 6 y = 6 16x+6y=6 16x+6y=6的解呢?因为6是2的3倍,所以求出来的特解就是 16 x + 6 y = 2 16x+6y=2 16x+6y=2求出的特解的3倍,也就是 x = − 3 , y = 9 x=-3,y=9 x=−3,y=9,同时 16 x + 6 y = 0 16x+6y=0 16x+6y=0的解是不变的,所以最后的解为 x = − 3 + 3 k , y = 9 − 8 k x=-3+3k,y=9-8k x=−3+3k,y=9−8k
青蛙的约会
以纬度线东经0度为起点,由东向西为正方向,总长为L米,青蛙A的起始点为x,一次能向正方向跳m米,青蛙B的起始点为y,一次能向正方向跳n米,跳一次花费时间相同,问跳几次会相遇
青蛙 A : ( x + k m ) % L 青蛙 B : ( y + k n ) % L ∴ x + k m ≡ y + k n ( m o d L ) k ( m − n ) + z L = y − x 青蛙A:(x+km)\%L\\ 青蛙B:(y+kn)\%L\\ \therefore x+km \equiv y+kn(\mod L)\\ k(m-n)+zL=y-x\\ 青蛙A:(x+km)%L青蛙B:(y+kn)%L∴x+km≡y+kn(modL)k(m−n)+zL=y−x
//求最小值的板子
#include <bits/stdc++.h>
using namespace std;
long long x,y,m,n,L,d,k,z;
int f=1;
long long exgcd(long long a,long long b,long long &x,long long &y){ //ax+by=gcd(a,b)
if(b==0){
x=1,y=0;
return a;
}
long long d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
cin>>x>>y>>m>>n>>L;
if(m<n){ //处理m-n为负数的情况
swap(n,m);
f=-1;
}
d=exgcd(m-n,L,k,z); //k(m-n)+zL=y-x
if((y-x)%d!=0){ //判断是否无解
cout<<"Impossible"<<endl;
return 0;
}
k=k*f*(y-x)/d; //求解k*(m-n)+zL=y-x
k=(k%(L/d)+(L/d))%(L/d); //求出最小的正数x
cout<<k<<endl;
return 0;
}