求组合数C(m,n)的多种计算方法

本文介绍了计算组合数C(m,n)的三种方法:简单法、Lucas定理及其扩展应用。针对不同情况,如p为素数且较小、p较大或p不是素数,提供了相应的计算策略,并给出了C++实现代码示例。" 132323826,11190723,英语词法详解:冠词用法,"['英语学习', '语法', '个人开发']
摘要由CSDN通过智能技术生成

https://ac.nowcoder.com/discuss/187813?type=101&order=0&pos=1&page=0

https://blog.csdn.net/shadandeajian/article/details/82084087

1.简单法---适合n,m很小

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
int C[MAXN+1][MAXN+1];
//求排列组合数C(m,n)  上面为m,下面为n  m<n
//C(m,n)=n!/m!/(n-m)!=n*(n-1)*..*(n-m+1)/m!.
int baoli_C(int m,int n)  //暴力法这里n<=15
{
    int summ=1,sumn=1;
    //其实算C(m,n)只要计算min(m,n-m)次就可以了
    if(m>n-m)
        m=n-m;
    for(int i=1;i<=m;i++){
        summ*=i;
        sumn=sumn*(n-i+1);
    }
    return sumn/summ;
}

void dabiao_C(){    //打表,数据为int,注意溢出数据   n<60
    //C(n, m)  = C(n -1, m - 1) + C(n - 1, m)
     for(int i=0;i<MAXN;i++)
    {
//         C[i][0]=1; C[0][i]=0;//该写法顺序是错误的,因为这样写C[0][0]=0;
         C[0][i]=0;C[i][0]=1;
    }
     for(int i=1;i<MAXN;i++)
        for(int j=1;j<MAXN;j++)
        C[i][j]=C[i-1][j-1]+C[i-1][j];
}

int main(){
    dabiao_C();
    int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值