lucas定理
p为素数
[dbinom n mequivdbinom {n\%p} {m\%p} dbinom {n/p}{m/p}(mod p)
]
左边一项直接求,右边可递归处理,不包含求组合数复杂度是(log_p(m))
证明
我们记(n=sp+q,m=tp+r,(q,r<p))
[dbinom {sp+q} {tp+r} equiv dbinom {s} {t} dbinom {q} {r} (mod p)
]
有这么一个性质(inom p dequiv0,0<d<p)
我们考虑使用幂来检验
利用扰动法(算两次)的思想
[egin{aligned}
(1+x)^n&equiv(1+x)^q*[(1+x)^p]^s (mod p)\
&equiv(1+x)^q*[sum_{t=0}^p inom p i x^i]^s(mod p)\
根据上面的那个性质\
&equiv(1+x)^q*(1+x^p)^s(mod p)\
&equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\
则有\
(1+x)^{sp+q}&equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\
sum_{k=0}^{sp+q}inom {sp+q} {k} x^k&equivsum_{i=0}^s inom s i x^{pt} * sum_{j=0}^qinom q j x^j(mod p)\
左边x^{tp+r}的系数为inom {sp+q}{tp+r}&\
右边x^{tp+r}的系数为inom s tinom q r &(因为q<p)\
系数在mod意义下相等\
得证
end{aligned}
]
推广
利用(lucas)定理可以(O(p))预处理逆元+(O(log_p(n)))回答询问
那么p为合数呢?
1.如果p较小
方法1:
(O(p))预处理出(p)内的素数,共(frac P {ln P})个
询问时扫一次素数
求出n,m,n-m中含有该素数多少个,求一个素数出现多少次要翻倍log次
复杂度(frac P {ln P}*log napprox n)
方法2:
将p分解质因数,每个lucas求一次,再用中国剩余定理
2.如果p较大:
有一篇FFT快速求n!的方法
布吉岛有没有用
先 挖坑