扩展Lucas定理

本介绍主要是在学习后写下自己的理解,故以转载形式发出。

题意: 给定 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 1mn1018,2p106
题解:

  • 目标:求 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,[pprimes]

    即:

    n ! m ! ( n − m ) ! m o d    P k \frac{n!}{m!(n-m)!}\mod P^k m!(nm)!n!modPk

    那么问题就是无法确定 n ! n! n!中的 P P P是否对取模 P k P^k Pk有影响,以及如何求出 m ! , ( n − m ) ! m!,(n-m)! m!,(nm)!的逆元。由于 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(nm)!Pxn!PxyzmodPk

  • 显然求出 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!=123...n=(P2P3P...)(12...)

          = 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...)      =PPn(12...Pn)(12...)

          = 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      =PPn(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) PPn(Pn)!(i=1,(i mod P=0)Pki)Pkn(i=PkPkn,(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=PkPkn,(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(nm)!Pxn!PxyzmodPk

    = 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(nm)f(n)PxyzmodPk

    此时 f ( m ) , f ( n − m ) f(m),f(n-m) f(m),f(nm)都与 P k P^k Pk互质,所以用 e x g c d exgcd exgcd求逆元即可。
    那么此时问题还剩 P x − y − z P^{x-y-z} Pxyz的求解。
    对于该式:

    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) PPn(Pn)!(i=1,(i mod P=0)Pki)Pkn(i=PkPkn,(i mod P=0)ni)

    幂存在于 P ⌊ n P ⌋ P^{\lfloor \frac{n}{P} \rfloor} PPn ( ⌊ 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(nm)!Pxn!Pg(n)g(m)g(nm)modPk

    最后再用中国剩余定理合并即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值