对普通Lucas不熟悉的可以看看这篇博客
拓展Lucas
在使用普通Lucas时,要求模数为质数,因为要用到模数 p p p的逆元。拓展Lucas用于处理 p p p不为质数的情况。
具体操作如下:
首先,我们对
p
p
p进行质因数分解得到:
p
=
p
1
x
1
⋅
p
2
x
2
⋅
.
.
.
⋅
p
m
x
m
p={p_1}^{x1}\cdot {p_2}^{x2}\cdot...\cdot {p_m}^{xm}
p=p1x1⋅p2x2⋅...⋅pmxm
我们欲求
C
(
n
,
m
)
m
o
d
p
=
n
!
/
m
!
/
(
n
−
m
)
!
m
o
d
p
C(n,m)\ mod\ p=n!/m!/(n-m)!\ mod\ p
C(n,m) mod p=n!/m!/(n−m)! mod p,如果能分别求得
n
!
/
m
!
/
(
n
−
m
)
!
m
o
d
p
i
x
i
n!/m!/(n-m)!\ mod\ {p_i}^{xi}
n!/m!/(n−m)! mod pixi,就能用
C
R
T
CRT
CRT求得答案。那么我们将问题转化为求
n
!
/
m
!
/
(
n
−
m
)
!
n!/m!/(n-m)!
n!/m!/(n−m)! 对
p
i
x
i
{p_i}^{xi}
pixi,下面简称为
p
p
p和
x
x
x。
求 n ! / m ! / ( n − m ) ! m o d p x n!/m!/(n-m)!\ mod\ p^x n!/m!/(n−m)! mod px,我们只需要会求 n ! m o d p x n!\ mod\ p^x n! mod px,另外两个阶乘分别求得。设 i ! m o d p x i!\ mod\ p^x i! mod px 为 F ( i ) F(i) F(i),可得到答案为 F ( n ) ∗ I n v ( F ( m ) ) ∗ I n v ( F ( n − m ) ) F(n) * Inv(F(m)) * Inv(F(n-m)) F(n)∗Inv(F(m))∗Inv(F(n−m))。下面我们考虑求解 F ( n ) F(n) F(n)
n ! = 1 ∗ 2 ∗ . . . ∗ n n!=1*2*...*n n!=1∗2∗...∗n,将其根据 p p p为长度分割得到 n ! = 1 ∗ 2 ∗ . . . ∗ p ∗ ( p + 1 ) ∗ ( p + 2 ) ∗ . . . ∗ 2 p ∗ ( 2 p + 1 ) ∗ . . . ∗ n n!=1*2*...*p*(p+1)*(p+2)*...*2p*(2p+1)*...*n n!=1∗2∗...∗p∗(p+1)∗(p+2)∗...∗2p∗(2p+1)∗...∗n。假设提出 p p p 到 2 p − 1 2p-1 2p−1 这一段,将其写作: p ∗ ( p + 1 ) ∗ ( p + 2 ) ∗ . . . ∗ ( p + p − 1 ) p*(p+1)*(p+2)*...*(p+p-1) p∗(p+1)∗(p+2)∗...∗(p+p−1),那么对于 p t ( 0 < = t < p ) p^t(0<=t<p) pt(0<=t<p),该项前的系数为 a 1 ∗ a 2 ∗ . . . ∗ a p − 1 − t a_1*a_2*...*a_{p-1-t} a1∗a2∗...∗ap−1−t。这里的 1 − ( p − 1 − t ) 1-(p-1-t) 1−(p−1−t)并不一定对应连续,因此我们要求一个 ∑ \sum ∑。设 d p [ i ] [ j ] dp[i][j] dp[i][j]为前 i i i 个 a a a中选 j j j 个的和。易得 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − 1 ] + a [ i ] dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+a[i] dp[i][j]=dp[i−1][j]+dp[i−1][j−1]+a[i],那么 d p [ t ] [ p − t − 1 ] dp[t][p-t-1] dp[t][p−t−1]就为系数。对于 p t p^t pt, t > x t > x t>x的项,我们可以直接模去,反之可以线性求解。而对于 2 p − ( 3 p − 1 ) 2p - (3p-1) 2p−(3p−1),推到 k p − ( k + 1 ) p − 1 kp-(k+1)p-1 kp−(k+1)p−1,同次数 p t p^t pt前的系数就为之前的 p − ( 2 p − 1 ) p-(2p-1) p−(2p−1)的系数前乘上一个 k t k^t kt。由此,我们可以求得一些段的答案。那么这么些“段”的定义是什么呢?我们发现,以 p x p^x px作为循环节分割,每个循环节的答案在模 p x p^x px下是等价的。如此,我们就学会了如何求 n ! m o d p x n!\ mod\ p^x n! mod px。
综上,我们就可以求 C ( n , m ) m o d p C(n,m)\ mod\ p C(n,m) mod p了。
话是这么说,代码是真难打啊……