定义:
若 a , b a,b a,b 为两个整数,满足 a m o d m = b m o d m a \bmod m = b \bmod m amodm=bmodm 或 ( a − b ) ∣ m (a-b) | m (a−b)∣m 则称 a a a 和 b b b 关于模 m m m 同余,记为 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm) 。
性质:
-
a ≡ a ( m o d m ) a \equiv a \pmod{m} a≡a(modm)
-
若 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm) , 则 b ≡ a ( m o d m ) b \equiv a \pmod{m} b≡a(modm) 。
-
若 a ≡ b ( m o d m ) , b ≡ a ( m o d m ) a \equiv b \pmod{m} \text{ , } b \equiv a \pmod{m} a≡b(modm) , b≡a(modm) 。
-
若 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm) , 则 a + c ≡ b + c ( m o d m ) a+c \equiv b+c \pmod{m} a+c≡b+c(modm) 。
-
若 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm) , 则 a × c ≡ b × c ( m o d m ) a \times c \equiv b \times c \pmod{m} a×c≡b×c(modm) 。
-
a × b m o d k = ( a m o d k × b m o d k ) m o d k a\times b \bmod k = (a \bmod k \times b \bmod k) \bmod k a×bmodk=(amodk×bmodk)modk 。
-
( a + b ) m o d k = ( a m o d k + b m o d k ) m o d k (a+ b) \bmod k = (a \bmod k + b \bmod k) \bmod k (a+b)modk=(amodk+bmodk)modk 。
-
若 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm) , 则 a n ≡ b n ( m o d m ) a^n \equiv b^n \pmod{m} an≡bn(modm) 。
-
若 a ≡ b ( m o d m ) , c ≡ d ( m o d m ) a \equiv b \pmod{m} \text{ , } c \equiv d \pmod{m} a≡b(modm) , c≡d(modm) , 则 a × c ≡ b × d ( m o d m ) a \times c \equiv b \times d \pmod{m} a×c≡b×d(modm) 。
证明:
有:
a × c m o d m = ( a m o d m × c m o d m ) m o d m a \times c \bmod m =(a \bmod m \times c \bmod m) \bmod m a×cmodm=(amodm×cmodm)modm
b × d m o d m = ( b m o d m × d m o d m ) m o d m b \times d \bmod m =(b \bmod m \times d \bmod m) \bmod m b×dmodm=(bmodm×dmodm)modm
a m o d m = b m o d m , c m o d m = d m o d m a \bmod m = b \bmod m \text{ , } c \bmod m = d \bmod m amodm=bmodm , cmodm=dmodm
则:
a × c m o d m = b × d m o d m a \times c \bmod m = b \times d \bmod m a×cmodm=b×dmodm
所以:
a × c ≡ b × d ( m o d m ) a \times c \equiv b \times d \pmod{m} a×c≡b×d(modm)
- 若 a × p ≡ x ( m o d m ) , a × q ≡ x ( m o d m ) a\times p \equiv x \pmod{m} \text{ , } a\times q \equiv x \pmod{m} a×p≡x(modm) , a×q≡x(modm) , p , q p,q p,q 互质 , 则 a m o d p × q = x a \bmod p \times q = x amodp×q=x 。
证明:
有 s , t s,t s,t 使
a = s × p + x , a = t × q + x a = s \times p + x \text{ , } a = t \times q + x a=s×p+x , a=t×q+x
则:
s × p = t × q s \times p = t \times q s×p=t×q
因为 p , q p,q p,q 互质,所以 p ∣ t , q ∣ s p|t \text{ , } q|s p∣t , q∣s 。
那么一定有 r r r 使
s = q × r s = q \times r s=q×r
则:
a = r × p × q + x a = r \times p \times q + x a=r×p×q+x
所以:
a m o d p × q = x a \bmod p \times q = x amodp×q=x
前置芝士gcd
拓展欧几里得算法
用途: 求 a × x + b × y = gcd ( a , b ) a \times x + b \times y = \gcd (a,b) a×x+b×y=gcd(a,b)
解法:
有:
gcd ( a , b ) = gcd ( b , a m o d b ) \gcd (a,b) = \gcd (b,a \bmod b) gcd(a,b)=gcd(b,amodb)
b × x ′ + ( a m o d b ) × y ′ = gcd ( b , a m o d b ) b \times x' + ( a \bmod b ) \times y' = \gcd (b,a \bmod b) b×x′+(amodb)×y′=gcd(b,amodb)
所以:
b × x ′ + ( a m o d b ) × y ′ = a × x + b × y b \times x' + ( a \bmod b ) \times y' = a \times x + b \times y b×x′+(amodb)×y′=a×x+b×y
因为 a m o d b = a − ⌊ a / b ⌋ × b a \bmod b = a- \lfloor a/b \rfloor \times b amodb=a−⌊a/b⌋×b
所以右式整理得:
b × x ′ + ( a m o d b ) × y ′ b \times x' + ( a \bmod b ) \times y' b×x′+(amodb)×y′
= b × x ′ + ( a − ⌊ a / b ⌋ × b ) × y ′ = b \times x' + ( a- \lfloor a/b \rfloor \times b ) \times y' =b×x′+(a−⌊a/b⌋×b)×y′
= a × y ′ + b × ( x ′ − ⌊ a / b ⌋ × y ′ ) = a\times y' + b\times ( x' - \lfloor a/b \rfloor \times y') =a×y′+b×(x′−⌊a/b⌋×y′)
所以
x = y ′ , y = x ′ − ⌊ a / b ⌋ × y ′ x=y' \text{ , } y= x' - \lfloor a/b \rfloor \times y' x=y′ , y=x′−⌊a/b⌋×y′
就可以递归求解:
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*y;
return gcd;
}
定理1:
若同余方程 a × x + b × y = c a \times x + b \times y = c a×x+b×y=c 有整数解,则有 gcd ( a , b ) ∣ c \gcd(a,b) | c gcd(a,b)∣c
定理2:
若 gcd ( a , b ) = 1 \gcd (a,b) = 1 gcd(a,b)=1 且 x 0 , y 0 x_0 , y_0 x0,y0 为 a × x + b × y = c a \times x + b \times y = c a×x+b×y=c 的一组解,那么方程的任意一组解为 x = x 0 + b × t , y = y 0 + a × t x=x_0 + b \times t , y=y_0 + a \times t x=x0+b×t,y=y0+a×t
特解:
求 x x x 的最小正整数解,即 t = b / gcd ( a , b ) , x = ( x m o d t + t ) m o d t t = b / \gcd(a,b) \text{ , } x= ( x \bmod t + t ) \bmod t t=b/gcd(a,b) , x=(xmodt+t)modt
例题:青蛙的约会
思路
因为两个青蛙同时跳到同一个点上才算碰面,设 t t t 为跳的次数, p p p 为两个青蛙跳的圈数之差,有如下式子:
( x + m × t ) − ( y + n × t ) = p × L (x+m \times t ) - ( y+n \times t ) = p \times L (x+m×t)−(y+n×t)=p×L
整理得:
( n − m ) × t + L × p = x − y (n-m) \times t + L \times p = x - y (n−m)×t+L×p=x−y
首先,要判断 gcd ( n − m , L ) ∤ x − y \gcd ( n-m , L ) \nmid x-y gcd(n−m,L)∤x−y 的情况。
然后,直接套拓展欧几里得算法,求出 ( n − m ) × t + L × p = gcd ( n − m , L ) (n-m) \times t + L \times p = \gcd ( n-m , L ) (n−m)×t+L×p=gcd(n−m,L) 一组解 t 0 , p 0 , g c d = gcd ( n − m , L ) t_0 \text{ , } p_0 \text{ , } gcd= \gcd ( n-m , L ) t0 , p0 , gcd=gcd(n−m,L) 。
带入特解(本题求的是 t t t 的最小解),求出 ( n − m ) × t + L × p = gcd ( n − m , L ) (n-m) \times t + L \times p = \gcd ( n-m , L ) (n−m)×t+L×p=gcd(n−m,L) 中 t 0 t_0 t0 的最小解 t ′ t' t′
t ′ = ( t 0 m o d L g c d + L g c d ) m o d L g c d t'= ( t_0 \bmod \dfrac{L}{gcd} + \dfrac{L}{gcd} ) \bmod \dfrac{L}{gcd} t′=(t0modgcdL+gcdL)modgcdL
有
t = t ′ × x − y g c d t = t' \times \dfrac{x - y}{gcd} t=t′×gcdx−y
所以
t = ( x − y g c d × t 0 m o d L g c d + L g c d ) m o d L g c d t=(\dfrac{x - y}{gcd} \times t_0 \bmod \dfrac{L}{gcd} + \dfrac{L}{gcd} ) \bmod \dfrac{L}{gcd} t=(gcdx−y×t0modgcdL+gcdL)modgcdL
C o d e Code Code
#define int long long
signed main()
{
int x,y,m,n,l;
int X,Y,gcd;
cin>>x>>y>>m>>n>>l;
int A=x-y,B=n-m;
if(B<0)//注意取反!!!
{
B=-B;
A=-A;
}
if(A%(gcd=exgcd(B,l,X,Y))!=0)
cout<<"Impossible"<<endl;
else
cout<<( A/gcd * X % (l/gcd) + (l/gcd) ) % (l/gcd)<<endl;
}
中国剩余定理(CRT)
思想
用于求:
{ x ≡ a 1 ( m o d m o d 1 ) x ≡ a 2 ( m o d m o d 2 ) x ≡ a 3 ( m o d m o d 3 ) . . . x ≡ a n − 2 ( m o d m o d n − 2 ) x ≡ a n − 1 ( m o d m o d n − 1 ) x ≡ a n ( m o d m o d n ) \begin{cases} x \equiv a_1 \pmod{mod_1} \\ x \equiv a_2 \pmod{mod_2} \\ x \equiv a_3 \pmod{mod_3} \\ ... \\ x \equiv a_{n-2} \pmod{mod_{n-2}} \\ x \equiv a_{n-1} \pmod{mod_{n-1}} \\ x \equiv a_n \pmod{mod_n} \end{cases} ⎩ ⎨ ⎧x≡a1(modmod1)x≡a2(modmod2)x≡a3(modmod3)...x≡an−2(modmodn−2)x≡an−1(modmodn−1)x≡an(modmodn)
其中 m o d 1 , m o d 2 , m o d 3 , . . . , m o d n mod_1 , mod_2 , mod_3 , ... , mod_n mod1,mod2,mod3,...,modn 互质。
接下来以求如下同余方程组为例:
{ x ≡ 2 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 2 ( m o d 7 ) \begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} ⎩ ⎨ ⎧x≡2(mod3)x≡3(mod5)x≡2(mod7)
先求如下三个方程组:
( 1 ) { x ≡ 1 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 0 ( m o d 7 ) ( 2 ) { x ≡ 0 ( m o d 3 ) x ≡ 1 ( m o d 5 ) x ≡ 0 ( m o d 7 ) ( 3 ) { x ≡ 0 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 1 ( m o d 7 ) (1) \; \begin{cases} x \equiv 1 \pmod{3} \\ x \equiv 0\pmod{5} \\ x \equiv 0 \pmod{7} \end{cases} \quad (2) \; \begin{cases} x \equiv 0 \pmod{3} \\ x \equiv 1 \pmod{5} \\ x \equiv 0 \pmod{7} \end{cases} \quad (3) \; \begin{cases} x \equiv 0 \pmod{3} \\ x \equiv 0 \pmod{5} \\ x \equiv 1 \pmod{7} \end{cases} (1)⎩ ⎨ ⎧x≡1(mod3)x≡0(mod5)x≡0(mod7)(2)⎩ ⎨ ⎧x≡0(mod3)x≡1(mod5)x≡0(mod7)(3)⎩ ⎨ ⎧x≡0(mod3)x≡0(mod5)x≡1(mod7)
以 ( 1 ) ( 1 ) (1) 为例:
求
{ x ≡ 1 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 0 ( m o d 7 ) \begin{cases} x \equiv 1 \pmod{3} \\ x \equiv 0\pmod{5} \\ x \equiv 0 \pmod{7} \end{cases} ⎩ ⎨ ⎧x≡1(mod3)x≡0(mod5)x≡0(mod7)
因为 x ≡ 0 ( m o d 5 ) x ≡ 0 ( m o d 7 ) x \equiv 0\pmod{5} \quad x \equiv 0 \pmod{7} x≡0(mod5)x≡0(mod7) ,所以 x x x 是 35 35 35 的倍数,等同于求
35 y ≡ 1 ( m o d 3 ) ( x = 35 y ) 35 y \equiv 1 \pmod{3} (x=35y) 35y≡1(mod3)(x=35y)
等同于求
2 y ≡ 1 ( m o d 3 ) ( x = 35 y ) 2 y \equiv 1 \pmod{3} (x=35y) 2y≡1(mod3)(x=35y)
所以
x ≡ ( y = 2 ) × 35 ≡ 70 ( m o d ( 105 = 3 × 5 × 7 ) ) x \equiv (y = 2) \times 35 \equiv 70 \pmod{(105= 3 \times 5 \times 7)} x≡(y=2)×35≡70(mod(105=3×5×7))
所以解为:
( 1 ) = 70 ( 2 ) = 21 ( 3 ) = 15 (1)=70 \quad (2)=21 \quad (3)=15 (1)=70(2)=21(3)=15
同理,有:
( 1 ) { x ≡ 2 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 0 ( m o d 7 ) = 35 ( 2 ) { x ≡ 0 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 0 ( m o d 7 ) = 63 ( 3 ) { x ≡ 0 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 2 ( m o d 7 ) = 30 (1) \; \begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 0\pmod{5} \\ x \equiv 0 \pmod{7} \end{cases} = 35 \quad (2) \; \begin{cases} x \equiv 0 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 0 \pmod{7} \end{cases} = 63 \quad (3) \; \begin{cases} x \equiv 0 \pmod{3} \\ x \equiv 0 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} =30 (1)⎩ ⎨ ⎧x≡2(mod3)x≡0(mod5)x≡0(mod7)=35(2)⎩ ⎨ ⎧x≡0(mod3)x≡3(mod5)x≡0(mod7)=63(3)⎩ ⎨ ⎧x≡0(mod3)x≡0(mod5)x≡2(mod7)=30
有:
{ x ≡ 2 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 2 ( m o d 7 ) = ( ( 1 ) + ( 2 ) + ( 3 ) ) m o d 105 = 128 m o d 105 = 23 \begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} =((1)+(2)+(3)) \bmod 105=128 \bmod 105 = 23 ⎩ ⎨ ⎧x≡2(mod3)x≡3(mod5)x≡2(mod7)=((1)+(2)+(3))mod105=128mod105=23
其中 m o d 105 \bmod 105 mod105 的原因是 x x x 可以同时去掉 3 , 5 , 7 3,5,7 3,5,7 使 x x x 更小,并且不会影响正确性。
C o d e Code Code
int China()
{
int x,y,ans=0,M,N=1;
for(int i=1; i<=n; i++)
N*=mod[i];
for(int i=1; i<=n; i++)
{
M=N/mod[i];
exgcd(mod[i],M,x,y);//直接套模板。
ans=(ans+(y*M*a[i])%N+N)%N;
}
if(a>0)return ans;
else
return ans+N;
}
逆元
思想
用于求 a × x ≡ 1 ( m o d b ) a \times x \equiv 1 \pmod{b} a×x≡1(modb) ( a , b a , b a,b 互质) 的 x x x , 称 x x x 为 a a a 的逆元,记为 a − 1 a^{-1} a−1 。
可用拓展欧几里得算法计算。
也可用费马定理计算。
费马定理: 若 a , p a,p a,p 互质且 p p p 为素数, a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp)
还可用递推计算。
首先:
1 − 1 ≡ 1 ( m o d p ) 1^{-1} \equiv 1 \pmod{p} 1−1≡1(modp)
设 p = k × i + r , r < i , 1 < i < p p=k\times i +r , r<i,1<i<p p=k×i+r,r<i,1<i<p
有
k × i + r ≡ 0 ( m o d p ) k\times i+r \equiv 0 \pmod{p} k×i+r≡0(modp)
两边同乘上 i − 1 i^{-1} i−1 , r − 1 r^{-1} r−1 。
k × r − 1 + i − 1 ≡ 0 ( m o d p ) k \times r^{-1} + i^{-1} \equiv 0 \pmod{p} k×r−1+i−1≡0(modp)
i − 1 ≡ − k × r − 1 ( m o d p ) i^{-1} \equiv -k \times r^{-1} \pmod{p} i−1≡−k×r−1(modp)
i − 1 ≡ − p i × ( p m o d i ) − 1 ( m o d p ) i^{-1} \equiv - \dfrac{p}{i} \times (p \bmod i)^{-1} \pmod{p} i−1≡−ip×(pmodi)−1(modp)
C o d e Code Code
long long exgcd_inv(long long a,long long mod)
{
long long d,x,y;
d=exgcd(a,n,x,y);
return d==1?(x+n)%n:-1;
}
long long fermat_inv(long long a,long long mod)
{
return pow_mod(a,mod-2,mod);
}
inv[i]=-(p/i)*inv[p%i];
威尔逊定理
若 p p p 为素数,则 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 \pmod{p} (p−1)!≡−1(modp) 。 若 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 \pmod{p} (p−1)!≡−1(modp) 为素数,则 p p p #
费马定理
若 a , p a,p a,p 互质且 p p p 为数, a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp)
费马小定理
若 p p p 为素数, a p ≡ a ( m o d p ) a^{p} \equiv a \pmod{p} ap≡a(modp)
未完待续…