组合数取模

赤裸裸的组合数取模没什么意思,但也是必须掌握的一门知识。一个计数的问题辛辛苦苦搞到最后发现被取模坑成狗也是很有可能的。今天主要总结一下各类取模问题。限长整(long)范围内。 所谓组合数取模,即求 Cmn % p

  1. 1<=m<=n<=1e3,1<=p<=long

    杨辉三角,直接递推 Cmn=Cmn1+Cm1n1

    • 1<=m<=n<=1e6,1<=p<=long,n<p,pprimes

      直接逆元,预处理出 n! 及其逆元即可。由费马小定理,对于 (a,p)=1 ,则, a1=ap2

    • 1<=m<=n<=long,1<=p<=long,pprimes

      Lucas定理。即令

      n=n0+n1p+n2p2++nkpk,0<=ni<p

      m=m0+m1p+m2p2++mkpk,0<=mi<p

      则有:
      Cmnmodp=i=0kCminimodp

      若存在 ni<mi ,则 Cmnmodp=0


    • 1<=m<=n<=1e6,1<=p<=long

      没错,将 Cmn 质因数分解,然后求模。具体是

      • 分别将 n!,m!,(nm)! 分解掉,然后指数相减得到最终的质因数分解。
      • 对每个质因数,快速幂取模


    • 1<=m<=n<=long,1<=p<=1e6

      由于p可以是合数,所以前面无论逆元还是Lucas都解决不了。
      将前面几种方法结合一下。

      • 将p质因数分解 p=ki=0paii
      • 对于每个 i[0,k] ,求 Cmnmodpaii=ri
      • 利用CRT求得最终模数

      于是问题变为,如何求 Cmnmodpa ?
      考虑 n!=qpk,(q,p)=1 k 称作p n! 中的重数。
      m! (nm)! 做同样处理,则

      Cmnmodpa=qnq1mq1nmpknkmknmmodpa

      k 可以用O(logk(n))求出来。若能求出 q 问题就迎刃而解了。
      不妨令
      f(n)=pdndmodp

      我们将 [1,n] 分成两类:
      1...p1,p+1....2p1,...,sp+1...n

      p,2p,3p,4p,...,sp

      第一类以 pa 为循环节,可利用 O(pa) 的复杂度求出,记答案为 g(n)
      第二类,容易发现其实就是 f(s)
      得到 f(n)=g(n)f(np)


    • 总结:
      其实只要 (n!,p)=1 ,根据裴蜀定理,这意味着 n!x+bp=1 有解。对于 1<=i<=n ,均存在关于 p i1,这时候可以用逆元在 O(nlog(p)) 的时间出解。
      总的来说,将取模问题归结为两类:

      n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值