组合数计算的几种方法之一,公式法(该方法适用于n和m均为小时使用) )公式:C(n,m)=C(n-1,m)+C(n-1,m-1)
计算中可以采用动态规划的方法
代码说明:
staticlongc(intn,int m ) {long[] res=new long[m 1]; Arrays.fill(RES,1 ); for(intI=0; i=n; I ) for(intj=math.min ) I,m ); j=0; j--}{if(j==0||I==j ) {res[j]=1; 继续; }res[j]=res[j] res[j-1]; } }返回RES [ m ]; )方法二、利用乘法逆元(该方法适用于对组合数求模型)对乘法逆元陌生人需要自行百度。 这里,为了将) a/b ) %p变换为(a*inv(b ) ) p而导入了乘法逆元),将除法求型变换为乘法求型,但是对于逆元的求解,由于本人喜欢使用费马小定理,所以满足了该要求
代码说明:
//组合数staticlongc(intn,int m ) if ) m0||nm ) return -1; //if不存在(m=n-m ) m=n-m; //转换为较小的一部分long up=1,lo=1的for(intI=0; im; I ) up=(up*(n-I ) ) %p; lo=(lo* ) I1 ) ) %p; }返回(up * inv ) (int ) lo,p ) %p; }staticintinv(inta,int p ) returnquickpow,p-2,p ); //求逆元的另一种方法//return(int ) long ) p-p/a (inv ) p%a,p ) %p; }staticintquickpow(inta、int b、int mod ) {long x=a % mod; 长RES=1; while(b!=0) if () B1 )==1) RES=) RES*x ) %mod; x=(x*x ) %mod; b=1; }返回(int ) res; }