lucas定理及其拓展的推导

我的前一篇博客—— lucas定理 https://mp.csdn.net/mdeditor/100550317#主要是给出了lucas的结论和模板,不涉及推导。

本篇文章
主要侧重lucas定理及其拓展的公式推导
。先从pwp^wpw的一般情况进行推导,最后令w=1w=1w=1进一步推导出了lucas定理的结论。可能会比较枯燥

想直接阅读结论的请转向这篇博客——拓展lucas结论及模板 https://blog.csdn.net/yuyilahanbao/article/details/100570075


(nm) mod pw\tbinom{n}{m} \bmod p^w(mn​)modpw的求取

p是素数。主要是计算(nm) mod pw\tbinom{n}{m} \bmod p^w(mn​)modpw的值。不想看推导过程的可以直接往下翻到下划线以后看结论。

对于(nm)=n!m!(n−m)!\tbinom{n}{m} = \frac{n!}{m!(n-m)!}(mn​)=m!(n−m)!n!​.

对于n!=1×2×3×…×n.n!=1 \times 2 \times 3 \times \ldots \times n.n!=1×2×3×…×n.

我们将这些数进行分组。假设k=⌊np⌋, r=n mod p;  u=npw, v=n mod pwk=\lfloor \frac{n}{p} \rfloor,\, r = n \bmod p;\;u=\frac{n}{p^w},\, v=n \bmod {p^w}k=⌊pn​⌋,r=nmodp;u=pwn​,v=nmodpw

  1. 把所有p的倍数抽出来,组成一组,它们的乘积记为AAA,易得A=∏i=1k(i×p)=pw×k!A=\prod\limits_{i=1}^{k}(i \times p)=p^w \times k!A=i=1∏k​(i×p)=pw×k!。

  2. 剩下的数中,把在这个区间内[upw+1,upw+v][up^w+1,up^w+v][upw+1,upw+v]中的数分为一组,记乘积为BBB.由于每个数都不是ppp的倍数,则BBB与pwp^wpw互质,BBB关于pwp^wpw的逆元Bpw−1B_{p^w}^{-1}Bpw−1​存在。

  3. 剩下的每个数a,把⌊apw⌋\lfloor \frac{a}{p^w} \rfloor⌊pwa​⌋相同的数分在一组,并把⌊apw⌋\lfloor \frac{a}{p^w} \rfloor⌊pwa​⌋作为它们的组号。每一组的乘积分别记作C0,C2,C3,C4,…,Cu−1C_0,C_2,C_3,C_4,\ldots,C_{u-1}C0​,C2​,C3​,C4​,…,Cu−1​。同理,显然CiC_iCi​与pwp^wpw互质,逆元存在。另外,每一组的乘积关于pwp^wpw是同模的,因为每一组的元素都是[pwi+1,pw(i+1))\left[p^wi+1,p^w(i+1)\right)[pwi+1,pw(i+1))的所有元素中去掉了ppp的倍数。

于是n!=AB∏i=0u−1Ci=pw×k!×B∏i=0u−1Cin!=AB\prod\limits_{i=0}^{u-1}C_i=p^w\times k! \times B\prod\limits_{i=0}^{u-1}C_in!=ABi=0∏u−1​Ci​=pw×k!×Bi=0∏u−1​Ci​.

回到原来组合数的问题,对于n,m,n−mn,m,n-mn,m,n−m依然有上面k,r,u,vk,r,u,vk,r,u,v的定义,只是分别用下标1,2,31,2,31,2,3区分。

于是(nm)=n!m!(n−m)!=pk1−k2−k3×k1!×B1×∏i=0u1−1Cik2!×k3!×B2×B3×∏i=0u2−1Ci×∏i=0u3−1Ci\tbinom{n}{m} = \frac{n!}{m!(n-m)!} = \frac{p^{k_1-k_2-k_3}\times {k_1}! \times B_1 \times \prod\limits_{i=0}^{u_1-1}C_i}{{k_2}! \times {k_3}! \times B_2 \times B_3 \times \prod\limits_{i=0}^{u_2-1}C_i \times \prod\limits_{i=0}^{u_3-1}C_i}(mn​)=m!(n−m)!n!​=k2​!×k3​!×B2​×B3​×i=0∏u2​−1​Ci​×i=0∏u3​−1​Ci​pk1​−k2​−k3​×k1​!×B1​×i=0∏u1​−1​Ci​​

注意到k1−k2−k3≥0k_1-k_2-k_3 \geq 0k1​−k2​−k3​≥0,事实上,它只能取0或1.BBB系列,CCC系列都是与pwp^wpw互质的,而且k1!k2!×k3!\frac{{k_1}!}{{k_2}! \times {k_3}!}k2​!×k3​!k1​!​依旧是个整数,所以,可以直接把分母中BBB,CCC系列中的直接变成乘以逆元抹去。

假设Bi≡bi(modpw)B_i \equiv b_i \pmod{p^w}Bi​≡bi​(modpw),Ci≡c(modpw)C_i \equiv c \pmod{p^w}Ci​≡c(modpw).b,c∈[1,pw)b,c \in \left[1,p^w\right)b,c∈[1,pw).

pk1−k2−k3×k1!×B1×∏i=0u1−1Cik2!×k3!×B2×B3×∏i=0u2−1Ci×∏i=0u3−1Ci≡pk1−k2−k3×b1×b2−1×b3−1×cu1×(c−1)u2×(c−1)u3×k1!k2!×k3!≡pk1−k2−k3×b1×b2−1×b3−1×cu1−u2−u3×k1!k2!×k3!(modpw)\frac{p^{k_1-k_2-k_3}\times {k_1}! \times B_1 \times \prod\limits_{i=0}^{u_1-1}C_i}{{k_2}! \times {k_3}! \times B_2 \times B_3 \times \prod\limits_{i=0}^{u_2-1}C_i \times \prod\limits_{i=0}^{u_3-1}C_i} \\ \equiv {
p^{k_1-k_2-k_3} \times b_1 \times {b_2}^{-1} \times {b_3}^{-1}
\times c^{u_1} \times (c^{-1})^{u_2} \times (c^{-1})^{u_3}
\times \frac{{k_1}!}{{k_2}! \times {k_3}!}
}\\ \equiv
{
p^{k_1-k_2-k_3} \times b_1 \times {b_2}^{-1} \times {b_3}^{-1}
\times c^{u_1-u_2-u_3}
\times \frac{{k_1}!}{{k_2}! \times {k_3}!}
} \pmod{p^w}k2​!×k3​!×B2​×B3​×i=0∏u2​−1​Ci​×i=0∏u3​−1​Ci​pk1​−k2​−k3​×k1​!×B1​×i=0∏u1​−1​Ci​​≡pk1​−k2​−k3​×b1​×b2​−1×b3​−1×cu1​×(c−1)u2​×(c−1)u3​×k2​!×k3​!k1​!​≡pk1​−k2​−k3​×b1​×b2​−1×b3​−1×cu1​−u2​−u3​×k2​!×k3​!k1​!​(modpw).

  1. 当r1≥r2r_1 \geq r_2r1​≥r2​时,k1=k2+k3k_1=k_2+k_3k1​=k2​+k3​,故上面这个式子最后分式的部分k1!k2!×k3!=(k1k2)\frac{{k_1}!}{{k_2}! \times {k_3}!}=\tbinom{k_1}{k_2}k2​!×k3​!k1​!​=(k2​k1​​).

  2. 否则,k1=k2+k3+1k_1=k_2+k_3+1k1​=k2​+k3​+1,最后的那个分式无法直接变成组合数,但是我们只需要分子分母同时乘以k1−k2k_1-k_2k1​−k2​,即可变成组合数。k1!k2!×k3!=(k1−k2)×(k1k2)\frac{{k_1}!}{{k_2}! \times {k_3}!}=(k_1-k_2) \times \tbinom{k_1}{k_2}k2​!×k3​!k1​!​=(k1​−k2​)×(k2​k1​​)


以上最后几行就是结论了,最后再次强调一下各个下标,字母代表的含义。

与n,m,n-m有关的量分别用下标1,2,3区分

k,r是除以ppp的商与余数,u,v是除以模数pwp^wpw的商与余数。

b是最后剩下的v个数中不是p的倍数的数的乘积

c是[1,pw]\left[1,p^w\right][1,pw]中不是p的倍数的数的乘积


从结论中的式子可以看到b,c我们只关注模pkp^kpk意义下的值,因此可以预先求出[1..i][1..i][1..i]中不是p的倍数的数的乘积f(i)f(i)f(i)(模pkp^kpk意义下的)。

lucas定理的推导

特殊地,当w=1w=1w=1时,kkk和uuu,rrr和vvv是相同的。

故b≡r!(modp),c≡(p−1)!(modp)b \equiv r! \pmod{p},\quad c \equiv (p-1)! \pmod{p}b≡r!(modp),c≡(p−1)!(modp),因此代入式子,可以得到lucas定理的结论。

  1. 当r1≥r2r_1 \geq r_2r1​≥r2​时,k1=k2+k3k_1=k_2+k_3k1​=k2​+k3​,故上面最后的式子可以化为ans≡r1!×(r2!)−1×(r3!)−1×(k1k2)(modp)ans \equiv {
    {r_1}! \times ({r_2}!)^{-1} \times ({r_3}!)^{-1} \times \tbinom{k_1}{k_2} \pmod{p}
    }ans≡r1​!×(r2​!)−1×(r3​!)−1×(k2​k1​​)(modp)

  2. 否则,k1=k2+k3+1k_1=k_2+k_3+1k1​=k2​+k3​+1,最后的那个分式无法直接变成组合数,但是我们只需要分子分母同时乘以k1−k2k_1-k_2k1​−k2​,即可变成组合数。k1!k2!×k3!=(k1−k2)×(k1k2)\frac{{k_1}!}{{k_2}! \times {k_3}!}=(k_1-k_2) \times \tbinom{k_1}{k_2}k2​!×k3​!k1​!​=(k1​−k2​)×(k2​k1​​)。而ans≡p×r1!×(r2!)−1×(r3!)−1×c×(k1−k2)×(k1k2)≡0(modp)ans \equiv {
    p \times {r_1}! \times ({r_2}!)^{-1} \times ({r_3}!)^{-1} \times c \times (k_1-k_2) \times \tbinom{k_1}{k_2}
    } \equiv 0 \pmod{p}ans≡p×r1​!×(r2​!)−1×(r3​!)−1×c×(k1​−k2​)×(k2​k1​​)≡0(modp)

(nm) mod N\tbinom{n}{m} \bmod N(mn​)modN的求取

N是任意正整数。对NNN进行素数分解。N=∏i=1qpikiN=\prod\limits_{i=1}^{q}p_i^{k_i}N=i=1∏q​piki​​.

对(nm) mod piki\tbinom{n}{m} \bmod p_i^{k_i}(mn​)modpiki​​问题,可以通过上一小节的拓展lucas求得,记答案是cic_ici​.

于是得到了qqq个线性同余方程,即线性同余方程组(nm)≡ci(modpiki)(1≤i≤q)\tbinom{n}{m} \equiv c_i \pmod{p_i^{k_i}} \quad (1 \leq i \leq q)(mn​)≡ci​(modpiki​​)(1≤i≤q).

对于线性同余方程组,并且注意到模数pikip_i^{k_i}piki​​两两互质,可以用中国剩余定理(也可以用拓欧)解出其通解x=x0+ktx=x_0+ktx=x0​+kt。并且由于模数互质,k=lcm(piki)=N(1≤i≤q)k=lcm(p_i^{k_i})=N \quad (1 \leq i \leq q)k=lcm(piki​​)=N(1≤i≤q).所以在[0,N)[0,N)[0,N)内只有一个特解x0x_0x0​,而这个特解就是(nm) mod N\tbinom{n}{m} \bmod N(mn​)modN.

至此,组合数对任意数的取模我们都予以解决了。

最新文章

  1. WdatePicker 使用
  2. oracle 身份证校验函数
  3. Innodb锁机制:Next-Key Lock 浅谈
  4. sql server 用户'sa'登录失败(错误18456)(转载)
  5. Pig用户自定义函数(UDF)转
  6. Groupon面经Prepare: Max Cycle Length
  7. Java—面向对象—构造方法及相关思维导图
  8. NOI 国家集训队论文集
  9. POJ 3026 Borg Maze
  10. HBase性能优化方法总结(转)
  11. css样式图片、渐变、相关小知识
  12. mahout安装和测试
  13. HDU 4916 Count on the path
  14. 转:LoadRunner中参数化技术详解
  15. 200行自定义异步非阻塞Web框架
  16. 从零开始学习前端开发 — 11、CSS3选择器
  17. Linux stat函数和stat命令
  18. jsonwebtoken收藏博客地址
  19. ssh很慢的问题转子
  20. U盘权限不足,只读文件系统

热门文章

  1. 并发队列之ConcurrentLinkedQueue
  2. Docker快速上手之部署SpringBoot项目
  3. Head First设计模式——状态模式
  4. gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(上)
  5. 深入JVM内存区域管理,值得你收藏
  6. HDU_4570_区间dp
  7. windows系统快速安装pytorch的详细教程
  8. 2018icpc南京现场赛-I Magic Potion(最大流)
  9. Leetcode题解 - 部分中等难度算法题解(56、957、825、781、1324、816)
  10. GitBook安装部署实操手册