笔记汇总
本节将讲解不同情况下 快速预处理排列与组合数 的方法
Pmn=n!(n−m)!
Cmn=n!m!(n−m)!
计算的时间复杂度主要与 m 有关。
除数与模数互质 O(nlogn)
从 上面的公式 可见,排列与组合数的 预处理 涉及到了 除法取模,所以需要 求逆元
因为用 扩展欧几里得求逆元 的条件是 除数与模数互质。
预处理出符合要求的 n! 和 n! 的逆元即可。
注意点
当 除数 是 模数 的倍数时,不存在逆元。
被除数与模数不互质 O(n2)
组合数有公式 Cmn=Cm−1n−1+Cmn−1,且并未涉及除法,
所以我们可以考虑先预处理出 Cmn,然后查表计算。
又因为 Pmn=Cmn∗m!,
所以我们在预处理完 组合数 后也可以顺带计算 排列数
Lucas 定理(模数为质数时)O(plogpn)
Lucas 定理是用来求 Cmn%p,p 为素数的值。
其结论为 Cba≡Cbpap∗Cb%pa%p(mod(p))
由组合数的性质可知 基础 (basic) 是显然的,由于证明需要用到 生成函数,故暂略,下面是性质。
若先将 a,b 用 p 进制表示,则每一次取 a%p 和 b%p 时,都相当于取 a,b 这两串 p 进制数的最后一位。
而 ap 和 bp 则相当于将 a,b 这两串 p 进制数右移一位。
进而可以 递归 拆解成 a,b 每一位的组合数相乘。
因为这个定理和 模数 p 有关,我们需要分析一下它们之间的 公因数。
对于一个数,只要它的因子里有 质因数 p, 它就会被整除。
而右边的哪个式子有一个特点,只要它的两个乘数中有一个有 质因子 p,就会被整除。
只有 b 不是 p 的倍数时,才会出现 Cb%pa%p>0
则 Cb%pa%p 不能整除 p,因为它的因子里不可能有 p(p为质数)。
也就是说如果 a,b 表示的 p 进制数中 b 有为 0 位才 可以整除 p
当然如果后面 b 已经没有了,也可以整除 p