模板
这好像不是个定理……
看起来是个算法,但是不知道为什么大家都叫它定理,所以我也跟着写了……
还有,这玩意儿好像跟Lucas定理没有半毛钱关系,不知道为什么叫exLucas……
前置知识
为了学会这个“定理”,你需要了解几样东西:
- 质因数分解
- CRT(中国剩余定理)
- 逆元
- 其他基础的数论
- 组合数的定义(???)
- 好的视力,或者一个放大镜(因为有的又有分数又有上下标,很容易看不清)
这些知识如果不会,可以参考我的另一篇博客(5、6除外)
规定
下面的讲解有几个规定:
- p p p为模数
- 除了 p p p以外的所有含 p p p的字母默认为质数
- 所有的数都是非负整数
- i i i的范围默认为距离这个 i i i最近(上面)的一次定义的 i i i的范围(可能在式子中)
- 与第四条类似, ( ∗ ) (*) (∗)式默认为距离这个 ( ∗ ) (*) (∗)式最近(上面)的一次定义的 ( ∗ ) (*) (∗)式
分解p
首先,我们要先将 p p p进行质因数分解
设 p = ∏ i = 1 t p i α i p=\prod \limits_{i=1}^{t}p_i^{\alpha_i} p=i=1∏tpiαi
这样,我们就只需要计算 ( n m ) m o d p i α i ( ∗ ) \binom{n}{m}modp_i^{\alpha_i}(*) (mn)modpiαi(∗),最后再用一下CRT就好了
算(∗)式!
看到这个式子,有的同学就会说:看! p i p_i pi是质数!直接用Lucas定理算!
……首先,我说过,这玩意儿跟Lucas定理没有半毛钱关系;其次,它还有个次数 α i \alpha_i αi啊!
首先,我们由组合数的定义可以知道: ( n m ) = n ! m ! ( n − m ) ! \binom{n}{m}=\frac{n!}{m!(n-m)!} (mn)=m!(n−m)!n!
这时候,又有同学要说了: 1 m ! ( n − m ) ! \frac{1}{m!(n-m)!} m!(n−m)!1直接求逆元啊!
……求逆元的前提是互质啊!你看 m ! ( n − m ) ! m!(n-m)! m!(n−m)!这个阶乘,它能跟 p i p_i pi互质吗?
所以,我们得把这玩意儿中的 p i p_i p