经典问题:怎么计算
当n不大时 (n<=5000) 可以递推复杂度
n稍大(n<=1e7)且p大于n时可以预处理出阶乘与阶乘逆元,复杂度
p<n且p是素数而n较大时可以用lucas定理
如果此时p是几个不同素数的乘积,可以分别lucas然后中国剩余定理合并
但如果p=p1^k1*p2^k2...怎么办(保证pi^ki<=100000)
此时是不能用lucas的,因为pi^ki不是素数
考虑能不能算出n! m! (n-m)!来做
但是阶乘在模意义下一旦i>p就是0,逆元就没法算了,怎么办
对于pi^ki 我们尝试把x! 分解成与pi互质的数的乘积乘以pi的幂次
前面的每pi一个循环,发现后面又是一个阶乘形式,于是可以递归做下去
时间复杂度好像是级别的
然后算组合数的话,前面杂数正常模意义下运算,后面p的幂次指数加减快速幂即可
对于多个pi,中国剩余定理合并即可