本介绍主要是在学习后写下自己的理解,故以转载形式发出。
题意: 给定
n
,
m
,
p
n,m,p
n,m,p,求
C
n
m
m
o
d
p
C_n^m\mod p
Cnmmodp,其中
1
≤
m
≤
n
≤
1
0
18
,
2
≤
p
≤
1
0
6
1\leq m\leq n\leq 10^{18},2\leq p\leq 10^6
1≤m≤n≤1018,2≤p≤106。
题解:
- 目标:求 C n m m o d p C_n^m\mod p Cnmmodp
- 对 p p p分解质因数: p = p 1 α 1 p 2 α 2 p 3 α 3 … p=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}\dots p=p1α1p2α2p3α3…
- 联想到中国剩余定理,
p
k
α
k
p_k^{\alpha_k}
pkαk是互质的模数,设
x
=
C
n
m
m
o
d
p
x=C_n^m\mod p
x=Cnmmodp,所以有:
{ C n m ( m o d p 1 α 1 ) C n m ( m o d p 2 α 2 ) . . . \left\{\begin{array}{l} C_n^m \pmod {p_{1}^{\alpha_1}}\\ C_n^m \pmod {p_{2}^{\alpha_2}}\\ ...\\ \end{array}\right. ⎩⎨⎧Cnm(modp1α1)Cnm(modp2α2)...
答案 x x x就是合并所有同余式得到的答案。
-
问题转换为了:
C n m m o d P k , [ p ∈ p r i m e s ] C_n^{m} \mod P^k,[p\in primes] CnmmodPk,[p∈primes]
即:
n ! m ! ( n − m ) ! m o d P k \frac{n!}{m!(n-m)!}\mod P^k m!(n−m)!n!modPk
那么问题就是无法确定 n ! n! n!中的 P P P是否对取模 P k P^k Pk有影响,以及如何求出 m ! , ( n − m ) ! m!,(n-m)! m!,(n−m)!的逆元。由于 a a a对 p p p存在逆元的条件是 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1
所以先将 P P P从中提出:n ! P x m ! P y ( n − m ) ! P z P x − y − z m o d P k \frac{\frac{n!}{P^x}}{\frac{m!}{P^y}\frac{(n-m)!}{P^z}}P^{x-y-z}\mod P^k Pym!Pz(n−m)!Pxn!Px−y−zmodPk
-
显然求出 n ! P x \frac{n!}{P^x} Pxn!即可。
-
对 n ! n! n!变形:
n ! = 1 ⋅ 2 ⋅ 3 ⋅ . . . ⋅ n = ( P ⋅ 2 P ⋅ 3 P . . . ) ( 1 ⋅ 2... ) n!=1\cdot2\cdot 3 \cdot ...\cdot n=(P\cdot 2P\cdot 3P...)(1\cdot2...) n!=1⋅2⋅3⋅...⋅n=(P⋅2P⋅3P...)(1⋅2...)
= P ⌊ n P ⌋ ( 1 ⋅ 2 ⋅ . . . ⋅ ⌊ n P ⌋ ) ( 1 ⋅ 2... ) \ \ \ \ \ = P^{\lfloor \frac{n}{P} \rfloor}(1\cdot2\cdot...\cdot\lfloor \frac{n}{P} \rfloor)(1\cdot2...) =P⌊Pn⌋(1⋅2⋅...⋅⌊Pn⌋)(1⋅2...)
= P ⌊ n P ⌋ ( ⌊ n P ⌋ ) ! ∏ n i = 1 , ( i m o d P ≠ 0 ) i \ \ \ \ \ = P^{\lfloor \frac{n}{P} \rfloor}(\lfloor \frac{n}{P} \rfloor)! \underset{i=1,(i \ mod\ P \neq0)}{\overset{n}{\prod}}i =P⌊Pn⌋(⌊Pn⌋)!i=1,(i mod P=0)∏ni
显然,后面这个连乘式是具有循环节的,且最后会有一段不完整的部分,这个部分长度也可能为 0 0 0。
即:P ⌊ n P ⌋ ( ⌊ n P ⌋ ) ! ( ∏ P k i = 1 , ( i m o d P ≠ 0 ) i ) ⌊ n P k ⌋ ( ∏ n i = P k ⌊ n P k ⌋ , ( i m o d P ≠ 0 ) i ) P^{\lfloor \frac{n}{P} \rfloor}(\lfloor \frac{n}{P} \rfloor)! (\underset{i=1,(i \ mod\ P \neq0)}{\overset{P^k}{\prod}}i)^{\lfloor \frac{n}{P^k} \rfloor}( \underset{i=P^k\lfloor \frac{n}{P^k} \rfloor,(i \ mod\ P \neq0)}{\overset{n}{\prod}}i) P⌊Pn⌋(⌊Pn⌋)!(i=1,(i mod P=0)∏Pki)⌊Pkn⌋(i=Pk⌊Pkn⌋,(i mod P=0)∏ni)
这里取 P k P^k Pk是因为 P k P^k Pk是这里的模数。
我们要求的是 n ! P x \frac{n!}{P^x} Pxn!,注意这里的 ( ⌊ n P ⌋ ) ! (\lfloor \frac{n}{P} \rfloor)! (⌊Pn⌋)!也可能有 P P P,故定义函数:
f ( n ) = n ! P x f(n)=\frac{n!}{P^x} f(n)=Pxn!
故有:
f ( n ) = f ( ⌊ n P ) ⌋ ( ∏ P k i = 1 , ( i m o d P ≠ 0 ) i ) ⌊ n P k ⌋ ( ∏ n i = P k ⌊ n P k ⌋ , ( i m o d P ≠ 0 ) i ) f(n)=f(\lfloor \frac{n}{P})\rfloor (\underset{i=1,(i \ mod\ P \neq0)}{\overset{P^k}{\prod}}i)^{\lfloor \frac{n}{P^k} \rfloor}( \underset{i=P^k\lfloor \frac{n}{P^k} \rfloor,(i \ mod\ P \neq0)}{\overset{n}{\prod}}i) f(n)=f(⌊Pn)⌋(i=1,(i mod P=0)∏Pki)⌊Pkn⌋(i=Pk⌊Pkn⌋,(i mod P=0)∏ni)
这样求解 f ( n ) f(n) f(n)的时间复杂度为 O ( log P n ) O(\log_{P} n) O(logPn)
考虑下边界即 f ( 0 ) = 0 ! P 0 = 1 f(0)=\frac{0!}{P^0}=1 f(0)=P00!=1
此时我们要求的式子为:n ! P x m ! P y ( n − m ) ! P z P x − y − z m o d P k \frac{\frac{n!}{P^x}}{\frac{m!}{P^y}\frac{(n-m)!}{P^z}}P^{x-y-z}\mod P^k Pym!Pz(n−m)!Pxn!Px−y−zmodPk
= f ( n ) f ( m ) f ( n − m ) P x − y − z m o d P k =\frac{f(n)}{f(m)f(n-m)}P^{x-y-z}\mod P^k =f(m)f(n−m)f(n)Px−y−zmodPk
此时 f ( m ) , f ( n − m ) f(m),f(n-m) f(m),f(n−m)都与 P k P^k Pk互质,所以用 e x g c d exgcd exgcd求逆元即可。
那么此时问题还剩 P x − y − z P^{x-y-z} Px−y−z的求解。
对于该式:P ⌊ n P ⌋ ( ⌊ n P ⌋ ) ! ( ∏ P k i = 1 , ( i m o d P ≠ 0 ) i ) ⌊ n P k ⌋ ( ∏ n i = P k ⌊ n P k ⌋ , ( i m o d P ≠ 0 ) i ) P^{\lfloor \frac{n}{P} \rfloor}(\lfloor \frac{n}{P} \rfloor)! (\underset{i=1,(i \ mod\ P \neq0)}{\overset{P^k}{\prod}}i)^{\lfloor \frac{n}{P^k} \rfloor}( \underset{i=P^k\lfloor \frac{n}{P^k} \rfloor,(i \ mod\ P \neq0)}{\overset{n}{\prod}}i) P⌊Pn⌋(⌊Pn⌋)!(i=1,(i mod P=0)∏Pki)⌊Pkn⌋(i=Pk⌊Pkn⌋,(i mod P=0)∏ni)
幂存在于 P ⌊ n P ⌋ P^{\lfloor \frac{n}{P} \rfloor} P⌊Pn⌋和 ( ⌊ n P ⌋ ) ! (\lfloor \frac{n}{P} \rfloor)! (⌊Pn⌋)!中:
所以设g ( n ) = ⌊ n P ⌋ + g ( ⌊ n P ⌋ ) g(n)=\lfloor \frac{n}{P} \rfloor+g(\lfloor \frac{n}{P} \rfloor) g(n)=⌊Pn⌋+g(⌊Pn⌋)
时间复杂度仍为 O ( log P n ) O(\log_{P}n) O(logPn)
考虑下边界为 g ( 0 ) = 0 g(0)=0 g(0)=0
最终式为:n ! P x m ! P y ( n − m ) ! P z P g ( n ) − g ( m ) − g ( n − m ) m o d P k \frac{\frac{n!}{P^x}}{\frac{m!}{P^y}\frac{(n-m)!}{P^z}}P^{g(n)-g(m)-g(n-m)}\mod P^k Pym!Pz(n−m)!Pxn!Pg(n)−g(m)−g(n−m)modPk
最后再用中国剩余定理合并即可。