exLucas - 拓展Lucas

对普通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=p1x1p2x2...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!/(nm)! mod p,如果能分别求得 n ! / m ! / ( n − m ) !   m o d   p i x i n!/m!/(n-m)!\ mod\ {p_i}^{xi} n!/m!/(nm)! mod pixi,就能用 C R T CRT CRT求得答案。那么我们将问题转化为求 n ! / m ! / ( n − m ) ! n!/m!/(n-m)! n!/m!/(nm)! 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!/(nm)! 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(nm))。下面我们考虑求解 F ( n ) F(n) F(n)

n ! = 1 ∗ 2 ∗ . . . ∗ n n!=1*2*...*n n!=12...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!=12...p(p+1)(p+2)...2p(2p+1)...n。假设提出 p p p 2 p − 1 2p-1 2p1 这一段,将其写作: p ∗ ( p + 1 ) ∗ ( p + 2 ) ∗ . . . ∗ ( p + p − 1 ) p*(p+1)*(p+2)*...*(p+p-1) p(p+1)(p+2...(p+p1),那么对于 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} a1a2...ap1t。这里的 1 − ( p − 1 − t ) 1-(p-1-t) 1(p1t)并不一定对应连续,因此我们要求一个 ∑ \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[i1][j]+dp[i1][j1]+a[i],那么 d p [ t ] [ p − t − 1 ] dp[t][p-t-1] dp[t][pt1]就为系数。对于 p t p^t pt t > x t > x t>x的项,我们可以直接模去,反之可以线性求解。而对于 2 p − ( 3 p − 1 ) 2p - (3p-1) 2p(3p1),推到 k p − ( k + 1 ) p − 1 kp-(k+1)p-1 kp(k+1)p1,同次数 p t p^t pt前的系数就为之前的 p − ( 2 p − 1 ) p-(2p-1) p(2p1)的系数前乘上一个 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了。

话是这么说,代码是真难打啊……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值