然后分开考虑 p 的倍数部分和不是 p 的倍数的部分,统计分子分母的质因数 p 的幂次,看看C_n^m 是不是 p 的倍数,然后不是 p 的倍数的部分就乘起来,分母的逆元乘上分子就行了。
引理:C_n^m 是整数
这部分的证明跟证明 C_n^m 是整数的方法挺像的,如果会了的话可以跳到下面的证明核心部分。
看这部分之前可以先看看如何用数论方法证明 C_n^m 是整数,方法也是对于每个质数 p,统计分子和分母 p 的幂次,然后证明分子的幂次一定大于等于分母的幂次。
那么怎么统计质数 p 的幂次呢?根据 莫比乌斯反演 容斥原理,要求一些数的乘积中质数 p 的幂次,就是把 p 的倍数找出来除以 p ,除完之后再把 p 的倍数找出来除以 p ,循环直到所有数都不是 p 的倍数,所以 p 的幂次就等于
p的倍数数量+p^2的倍数数量+p^3的倍数数量+\cdots
接下来的问题就是对于任何一个数 k,要统计 1 到 m 和 n-m+1 到 n 中 k 的倍数有多少个, 1 到 m 就有 \lfloor \frac m k \rfloor 个数是 k 的倍数, n-m+1 到 n 中有 (\lfloor \frac n k \rfloor-\lfloor \frac {n-m} k \rfloor) 个
这里我设 k=5,要统计 5 的倍数,我画了个图,看看 1 到 m 和 n-m+1 到 n 这两个区间各覆盖了多少个 k 的倍数。可以发现 n-m+1 到 n (分子)中 k 的倍数数量一定大于等于 1 到 m (分母)中 k 的倍数数量,二者可能相等也可能相差 1 ,所以说分子中 p 总幂次 =p的倍数数量+p^2的倍数数量+p^3的倍数数量+\cdots 一定 \geq 分母中的,这就证明了组合数 C_n^m 一定为整数。然后 p 的倍数数量、p^2 的倍数数量、p^3 的倍数数量 \cdots 里只要有任何一个是分子大于分母的,分子的 p 总幂次就会大于分母的 p 总幂次。
数论里跟取模有关的事情经常会出现循环,那么组合数取模写出来之后也能发现循环,这里我举了 p=3,n=17,m=7 的例子画图,把 C_n^m=\frac{(n-m+1)(n-m+2) \cdots n}{1\times2 \cdots m} 里面的数列了出来,之后,然后把p的倍数圈起来,想分成 p 的倍数和不是 p 的倍数两部分考虑。
圈起来的 p 的倍数部分每个数除以 p 之后就变成连续的一段了,分子就是从 1 乘到 \lfloor \frac m p \rfloor ,而分母是从 \lfloor \frac n p \rfloor 开始往下数,一共 \lfloor \frac m p \rfloor 个数乘起来,所以说这部分就等于C_{\lfloor n/p \rfloor}^{\lfloor m/p \rfloor}
然后考虑剩下的不是 p 的倍数的部分,根据逆元唯一性,中间除以 p 的余数相同的部分全都可以直接划掉,就剩下两边,不难证明,两边的部分就同余于 C_{n\%p}^{m\%p}