常用定理
1. 欧拉定理(费马-欧拉定理)
若
n
,
a
n, a
n,a为正整数且
n
,
a
n, a
n,a互素,则有如下公式:
a
φ
(
n
)
≡
1
a^{\varphi(n)} \equiv 1
aφ(n)≡1 (mod n)
含义:
a
φ
(
n
)
a^{\varphi(n)}
aφ(n)与1在模n下 同余,其中
φ
(
n
)
\varphi(n)
φ(n)为欧拉函数,代表小于或等于
n
n
n的正整数中与
n
n
n互质的数的数目。
举个栗子:
a
=
3
,
n
=
5
a=3, n=5
a=3,n=5,小于5的正整数中与5互质的数为1,2,3,4,所以
φ
(
5
)
=
4
\varphi(5) = 4
φ(5)=4,那么
3
4
≡
1
3^{4} \equiv 1
34≡1 mode 5,成立。
应用:本定理可大程度地简化幂的模运算。
[
1
]
^{[1]}
[1]比如计算
7
222
7^{222}
7222的个位数时,可将此命题视为求
7
222
7^{222}
7222被10除的余数。因为7和10互质,而
φ
(
10
)
=
4
\varphi(10) = 4
φ(10)=4,所以
7
222
=
7
4
⋅
55
+
2
=
(
7
4
)
55
⋅
7
2
≡
1
55
⋅
7
2
≡
49
≡
9
(
m
o
d
10
)
7^{{222}}=7^{{4\cdot 55+2}}=(7^{4})^{{55}}\cdot 7^{2}\equiv 1^{{55}}\cdot 7^{2}\equiv 49\equiv 9{\pmod {10}}
7222=74⋅55+2=(74)55⋅72≡155⋅72≡49≡9(mod10)。
2. 费马小定理
假如a是一个整数,p是一个质数,那么
a
p
−
a
a^{p}-a
ap−a是p的倍数,可以表示为
a
p
≡
a
(
m
o
d
p
)
a^{p}\equiv a{\pmod {p}}
ap≡a(modp)。如果a不是p的倍数,这个定理也可以写成
a
p
−
1
≡
1
a^{p-1} \equiv 1
ap−1≡1 (mod p)。
应用:计算
2
100
2^{{100}}
2100除以13的余数:
2
100
≡
2
12
×
8
+
4
(
m
o
d
13
)
≡
(
2
12
)
8
⋅
2
4
(
m
o
d
13
)
≡
1
8
⋅
16
(
m
o
d
13
)
≡
16
(
m
o
d
13
)
≡
3
(
m
o
d
13
)
2^{{100}}\equiv 2^{{12\times 8+4}}{\pmod {13}} \equiv (2^{{12}})^{8}\cdot 2^{4}{\pmod {13}} \equiv 1^{8}\cdot 16{\pmod {13}} \equiv 16{\pmod {13}} \equiv 3{\pmod {13}}
2100≡212×8+4(mod13)≡(212)8⋅24(mod13)≡18⋅16(mod13)≡16(mod13)≡3(mod13)
3.威尔逊定理
当且仅当p为质数时:
(
p
−
1
)
!
≡
−
1
(p-1)! \equiv -1
(p−1)!≡−1 mod p
含义:给出了判定一个自然数是否为质数的充分必要条件。但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大。
4.卢卡斯定理
A、B是非负整数,
p
p
p是质数。A、B写成p进制:
A
=
a
[
n
]
a
[
n
−
1
]
.
.
.
a
[
0
]
,
B
=
b
[
n
]
b
[
n
−
1
]
.
.
.
b
[
0
]
A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]
A=a[n]a[n−1]...a[0],B=b[n]b[n−1]...b[0]。则组合数
C
(
A
,
B
)
C(A,B)
C(A,B)与
C
(
a
[
n
]
,
b
[
n
]
)
∗
C
(
a
[
n
−
1
]
,
b
[
n
−
1
]
)
∗
.
.
.
∗
C
(
a
[
0
]
,
b
[
0
]
)
C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])
C(a[n],b[n])∗C(a[n−1],b[n−1])∗...∗C(a[0],b[0]) mod p同余,即
L
u
c
a
s
(
n
,
m
,
p
)
=
c
(
n
%
p
,
m
%
p
)
∗
L
u
c
a
s
(
n
/
p
,
m
/
p
,
p
)
Lucas(n,m,p)=c(n\%p, m\%p)*Lucas(n/p,m/p,p)
Lucas(n,m,p)=c(n%p,m%p)∗Lucas(n/p,m/p,p)
应用:(一道模板题)用于处理组合数取模,
C
(
n
,
m
)
C(n,m)
C(n,m) mod p,其中p为素数。
附上模板题AC代码:
#include<bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
ll a[N]; //代表N的阶乘mod p后的结果
int p;
ll pow(ll y, int z, int p) {
y %= p;
ll ans = 1;
for(int i=z; i; i>>=1, y=y*y%p) //快速幂
if(i&1) //奇数
ans = ans*y%p;
return ans;
}
ll C(ll n, ll m) {
if(m>n) return 0;
return ((a[n]*pow(a[m], p-2, p))%p * pow(a[n-m], p-2, p)%p); //逆元,所以是乘法
}
ll Lucas(ll n, ll m) {
if(!m) return 1;
return C(n%p, m%p) * Lucas(n/p, m/p)%p;
}
int main() {
int T, n, m;
cin>>T;
while(T--) {
cin>>n>>m>>p;
a[0] = 1;
for(int i=1; i<=p; i++)
a[i] = (a[i-1]*i)%p;
cout<<Lucas(n+m, n)<<endl;
}
return 0;
}
参考资料:
[1] https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%AE%9A%E7%90%86_(%E6%95%B0%E8%AE%BA)