组合数公式用C语言怎么算,求组合数C(m,n)的多种计算方法

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很小

#includeusing namespacestd;const int MAXN = 1000;int C[MAXN+1][MAXN+1];//求排列组合数C(m,n) 上面为m,下面为n m//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)

{//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)

for(int j=1;j)

C[i][j]=C[i-1][j-1]+C[i-1][j];

}intmain(){

dabiao_C();intm,n;while(cin>>m>>n){ //mcout

}

}

2.Lucas定理求组合数

组合数C(n, m) % p

= (n!/m!/(n-m)!)%mod     组合数公式

= n!*inv(m!*(n-m)!)%mod    转化式子

= n!*(m!*((n-m)!)^(mod-2))%mod     由于p是素数,有费马小定理可知,m! * (n - m)! 关于p的逆元就是m! * (n - m)!的p-2次方。

=(n*(n-1)*..*(n-m+1) / m!) %mod.==( (n*(n-1)*..*(n-m+1))  * (m^(mod-2)) ) %mod.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C 语言中,你可以使用下面的代码来计组合数: long long combination(int n, int m) { long long res = 1; for (int i = n - m + 1; i <= n; i++) { res *= i; } for (int i = 2; i <= m; i++) { res /= i; } return res; } 这段代码使用了阶乘和乘法原理来计组合数。首先计出分子 (n-m+1)×(n-m+2)×...×n,然后除以阶乘 m!。这样就可以得到从 n 个不同元素中取出 m 个元素的组合数 C n m 。 注意:在计阶乘时要使用 long long 类型,因为在 n 和 m 很大的情况下,int 类型可能会溢出。 ### 回答2: C语言可以通过循环和递归两种方式来计组合数。 循环方式计组合数: 1. 首先定义一个函数用于计阶乘,即计 n! 的值。 ```c int factorial(int n) { int result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } ``` 2. 定义一个函数用于计组合数 C(n, m)。根据组合数公式,可以计出 C(n, m) = n! / (m! * (n-m)!) 。 ```c int combination(int n, int m) { int numerator = factorial(n); int denominator = factorial(m) * factorial(n-m); int result = numerator / denominator; return result; } ``` 3. 在主函数中调用组合数函数,并输出结果。 ```c #include <stdio.h> int factorial(int n); int combination(int n, int m); int main() { int n, m; printf("请输入元素个数 n:"); scanf("%d", &n); printf("请输入取出元素个数 m:"); scanf("%d", &m); int result = combination(n, m); printf("从 %d 个不同元素中取出 %d 个元素的组合数为:%d\n", n, m, result); return 0; } ``` 通过上述方法,我们可以用C语言出给定 n 和 m 的组合数。 ### 回答3: 在C语言中,可以使用循环和递归的方法来计组合数。 首先,我们可以使用一个循环来计阶乘的值。根据公式,m的阶乘可以通过循环从1到m累乘得到,而(n-m)的阶乘也可以通过循环从1到(n-m)累乘得到。我们再使用一个循环来计n的阶乘。 然后,我们可以使用上述计出的阶乘值来计组合数。根据公式组合数可以通过将n的阶乘除以(m的阶乘 * (n-m)的阶乘)得到。 接下来是利用C语言来实现上述法的示例代码: ```c #include <stdio.h> // 计阶乘的函数 int factorial(int num) { int fact = 1; for (int i = 1; i <= num; i++) { fact *= i; } return fact; } // 计组合数的函数 int combination(int n, int m) { int combination = factorial(n) / (factorial(m) * factorial(n - m)); return combination; } int main() { int n, m; printf("请输入n和m的值(以空格分隔):"); scanf("%d%d", &n, &m); int result = combination(n, m); printf("从%d个不同元素中取出%d个元素的组合数为:%d\n", n, m, result); return 0; } ``` 通过上述代码,我们可以输入n和m的值,然后调用combination函数进行计,最后输出结果。这样就可以使用C语言来根据给定的公式出从n个不同元素中取出m个元素的组合数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值