本来没打算学的,既然模拟赛考到了就还是学一下吧

Pre-Knowledge

Brief Introduction

我们都知道,Lucas定理是当n,mn,m比较大(大于PP)时,用来求 ,其中PP为质数的一个工具。它长这样:

nnmm 表示成 PP 进制数,对 PP进制下的每一位分别计算组合数,最后乘起来。这样递归计算的话就能保证需要求的n,mn,mPP的范围内了

但是当 不为质数的时候就需要用到扩展Lucas了,但其实它和Lucas没有半毛钱关系

Analysis

  1. pp质因数分解,即分解成P=pikiP = \prod p_i^{k_i}的形式,那么只需要分别求出 ,利用CRTex_CRT就能合并答案

  2. 把组合数展开:

    考虑把n!,m!,(nm)!n!,m!,(n-m)!这三项中含pip_i的因子提出来,变形得到

    其中a1,a2,a3a1, a2, a3分别表示n!,m!,(nm)!n!,m!,(n-m)!pip_i的次数

  3. 解决 这个子问题,注意在计算上式的分母时需要用ex_gcd求逆元

最后一步步往上推就行了

Process

重点在于如何求

先举一个例子吧,假设n=19,p=3,k=2n = 19, p = 3, k = 2

这里真的随便手玩一下就懂了

19!=1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19 19!=1\times 2\times 3\times 4\times 5\times 6\times 7\times 8\times 9\times 10 \times 11\times 12\times 13\times 14\times 15\times 16\times 17\times 18\times 19

把所有pp的倍数的项提出来:

19!=36×(1×2×3×4×5×6)×(1×2×4×5×7×8×10×11×13×14×16×17×19) 19!=3^6 \times (1\times 2\times 3\times 4\times 5\times 6)\times(1\times 2\times 4\times 5\times 7\times 8\times 10 \times 11\times 13\times 14\times 16\times 17\times 19)

不难注意到最后一个括号里的数在模pkp^k意义下是不断循环的,即

19!=36×(1×2×3×4×5×6)×(1×2×4×5×7×8)×(10×11×13×14×16×17)×19 19!=3^6 \times (1\times 2\times 3\times 4\times 5\times 6)\times(1\times 2\times 4\times 5\times 7\times 8)\times (10 \times 11\times 13\times 14\times 16\times 17)\times 19

很显然,(1×2×4×5×7×8)(1\times 2\times 4\times 5\times 7\times 8)(10×11×13×14×16×17)(10 \times 11\times 13\times 14\times 16\times 17)在模pkp^k意义下相等

那么

19!=36×6!×(1×2×4×5×7×8)2×19 19!=3^6 \times 6!\times(1\times 2\times 4\times 5\times 7\times 8)^2\times 19

通过上面这个例子,我们可以形式化地得出以下式子:

其中numinum_i表示不含pp因子的数字

考虑每一项的意义以及如何求:

  • pnp p^{\lfloor \frac{n}{p} \rfloor} :因为最后我们要求 ,需要除掉pap^a,因此可以在这里直接不乘这一项
  • np!\lfloor \frac{n}{p} \rfloor! :直接递归求解,边界条件是n=0n=0答案为11
  • :也就是小于 的部分循环了 次。可以直接暴力求出 ,然后做一遍快速幂
  • :循环最后会剩下一部分多的,直接暴力乘起来即可

Complexity

瞎分析一波

首先分析一下求解 的复杂度

T(n)=T(np)+O(pk) T(n) = T(\frac{n}{p}) + O(p^k)

根据主定理容易得到T(n)=O(pk)T(n) = O(p^k )

另外,ex_gcd求逆元那里还有一个 的复杂度

总复杂度为

O((piki+logP)) O\Big(\sum (p_i^{k_i} + \log P)\Big)

Code

还没写