对于组合数我们可以将其表示成阶乘的形式:C(n,k)= 。那我们不妨把这三个阶乘全部表示成上个专题的形式。这样的话,如果对于e1>e2+e3就可以被p整除,e1=e2+e3就无法被p整除。在无法被整除的情况下C(n,k)=a1(a2a3)-1
1 int mod_comb (int n, int k, int p){ 2 if (n<0||k<0||n<k) return 0; 3 int a1=mod_fact(n,p,e1),a2=mod_fact(k,p,e2),a3=mod_fact(n-k,p,e3); 4 if (e1>e2+e3)return 0; 5 return a1*mod_inverse(a2*a3%p, p) %p; 6 }