卢卡斯定理(Lucas定理)
链接中视频给出的代码是错误的,因为有可能出现 n m o d p < m m o d p n\;mod\;p<m\;mod\;p nmodp<mmodp的情况,getC函数可能会越界。尽管这份代码不开O2确实是可以通过的,但是开了O2会无法通过。
卢卡斯定理解决大组合数模质数的问题。
卢卡斯定理指的是:
I
n
i
=
0
(
a
i
‾
(
p
)
b
i
‾
←
(
p
)
)
≡
∏
i
=
0
n
(
a
i
b
i
)
(
m
o
d
p
)
(
p
∈
P
)
\underset{i=0}{\overset{n}{\mathbb{I}}}\left({\begin{matrix} \overline{a_i}_{(p)}\\ \underleftarrow{\overline{b_i}}_{(p)} \end{matrix}}\right)\equiv \overset{n}{\underset{i=0}\prod}\left(\begin{matrix} a_i\\ b_i \end{matrix}\right)\pmod p\;\;\;(p\in\mathbb{P})
i=0In(ai(p)bi(p))≡i=0∏n(aibi)(modp)(p∈P)
其中
I
\mathbb{I}
I表示循环记号,
a
n
a
n
−
1
.
.
.
‾
(
p
)
\overline{a_na_{n-1}...}_{(p)}
anan−1...(p)表示将
a
n
,
a
n
−
1
,
.
.
.
a_n,a_{n-1},...
an,an−1,...依照次序连成一个
p
p
p进制数。
卢卡斯定理是一个把组合数分解 p p p进制的过程,它表明,分解前后组合数模意义下相等。
卢卡斯定理还有一个常用版本:
(
n
m
)
≡
(
n
/
p
m
/
p
)
+
(
n
m
o
d
p
m
m
o
d
p
)
(
m
o
d
p
)
\left(\begin{matrix} n\\ m \end{matrix}\right)\equiv \left(\begin{matrix} n/p\\ m/p \end{matrix}\right)+\left(\begin{matrix} n\;mod\;p\\ m\;mod\;p \end{matrix}\right)\pmod p
(nm)≡(n/pm/p)+(nmodpmmodp)(modp)
其中
/
/
/表示整除。
证明一下:
(奥秘重重的证明过程)
设 p ∈ P p\in\mathbb{P} p∈P
引理1
( x p ) ≡ 0 ( m o d p ) ( 0 < x < p ) (^p_x)\equiv 0\pmod p\;\;\;(0<x<p) (xp)≡0(modp)(0<x<p)
这是因为,显然有 ( x p ) ≡ p ! x ! ( p − x ) ! ≡ p x ⋅ ( p − 1 ) ! ( x − 1 ) ! ( ( p − 1 ) − ( x − 1 ) ) ! ≡ p ⋅ x − 1 ⋅ ( x − 1 p − 1 ) ≡ 0 ⋅ x − 1 ⋅ ( x − 1 p − 1 ) ≡ 0 (^p_x)\equiv \frac{p!}{x!(p-x)!}\equiv \frac{p}{x}\cdot \frac{(p-1)!}{(x-1)!((p-1)-(x-1))!}\equiv p\cdot x^{-1}\cdot (^{p-1}_{x-1})\equiv 0\cdot x^{-1}\cdot (^{p-1}_{x-1})\equiv 0 (xp)≡x!(p−x)!p!≡xp⋅(x−1)!((p−1)−(x−1))!(p−1)!≡p⋅x−1⋅(x−1p−1)≡0⋅x−1⋅(x−1p−1)≡0
在提出 p p p的过程中,必须提出 x x x,得到一个更小的组合数的原因是,必须要保证提出 p p p之后仍然是整数。
引理2
( 1 + x ) p ≡ 1 + x p ( m o d p ) (1+x)^p\equiv 1+x^p\pmod p (1+x)p≡1+xp(modp)
结合引理1,做二项式展开易证。
结论
设
n
=
k
1
p
+
r
1
,
m
=
k
2
p
+
r
2
(
0
≤
r
1
,
r
2
<
p
)
n=k_1p+r_1,m=k_2p+r_2(0\leq r_1,r_2<p)
n=k1p+r1,m=k2p+r2(0≤r1,r2<p),则有:
(
1
+
x
)
n
≡
∑
m
=
0
n
(
m
n
)
x
m
≡
∑
m
=
0
k
1
p
+
r
1
(
k
2
p
+
r
2
k
1
p
+
r
1
)
x
k
2
p
+
r
(1+x)^n\equiv \overset{n}{\underset{m=0}\sum}(^n_m)x^{m}\equiv\overset{k_1p+r_1}{\underset{m=0}\sum}\left(^{k_1p+r_1}_{k_2p+r_2}\right)x^{k_2p+r}
(1+x)n≡m=0∑n(mn)xm≡m=0∑k1p+r1(k2p+r2k1p+r1)xk2p+r
另有:
(
1
+
x
)
n
≡
(
1
+
x
)
k
1
p
(
1
+
x
)
r
1
(1+x)^n\equiv (1+x)^{k_1p}(1+x)^{r_1}
(1+x)n≡(1+x)k1p(1+x)r1
≡
(
(
1
+
x
)
p
)
k
1
(
1
+
x
)
r
1
\equiv \left((1+x)^p\right)^{k_1}(1+x)^{r_1}
≡((1+x)p)k1(1+x)r1
应用引理2:
≡
(
1
+
x
p
)
k
1
(
1
+
x
)
r
1
\equiv (1+x^p)^{k_1}(1+x)^{r_1}
≡(1+xp)k1(1+x)r1
≡
∑
i
=
0
k
1
(
i
k
1
)
x
i
⋅
p
×
∑
j
=
0
r
1
(
j
r
1
)
x
j
\equiv \overset{k_1}{\underset{i=0}\sum}\left(^{k_1}_i\right)x^{i\cdot p}\times\overset{r_1}{\underset{j=0}\sum}\left(^{r_1}_{j}\right)x^{j}
≡i=0∑k1(ik1)xi⋅p×j=0∑r1(jr1)xj
对比系数:
≡
∑
m
=
0
k
1
p
+
r
1
(
k
2
p
+
r
2
k
1
p
+
r
1
)
x
k
2
p
+
r
\equiv\overset{k_1p+r_1}{\underset{m=0}\sum}\left(^{k_1p+r_1}_{k_2p+r_2}\right)x^{k_2p+r}
≡m=0∑k1p+r1(k2p+r2k1p+r1)xk2p+r
≡
∑
i
=
0
k
1
(
i
k
1
)
x
i
⋅
p
×
∑
j
=
0
r
1
(
j
r
1
)
x
j
\equiv \overset{k_1}{\underset{i=0}\sum}\left(^{k_1}_i\right)x^{i\cdot p}\times\overset{r_1}{\underset{j=0}\sum}\left(^{r_1}_{j}\right)x^{j}
≡i=0∑k1(ik1)xi⋅p×j=0∑r1(jr1)xj
可以看出,显然,模
p
p
p下可以把一个数分解:
(
n
m
)
≡
(
n
/
p
m
/
p
)
+
(
n
m
o
d
p
m
m
o
d
p
)
(
m
o
d
p
)
\left(\begin{matrix} n\\ m \end{matrix}\right)\equiv \left(\begin{matrix} n/p\\ m/p \end{matrix}\right)+\left(\begin{matrix} n\;mod\;p\\ m\;mod\;p \end{matrix}\right)\pmod p
(nm)≡(n/pm/p)+(nmodpmmodp)(modp)
QED.
时间复杂度O(logn)
组合数模合数较繁。
后记
于是皆大欢喜。