c语言排列组合算法
程序员文章站
2022-05-21 23:18:19
...
排列组合算法
第五组
1.ACM协会晚会
ACM协会的会员越来越多了,训练量也越来也大,为使会员们在高强度的训练下得到放松,会员之间更加亲近,协会想为会员们准备一个晚会,晚会节目由会员们表演。
消息一出,报名要表演节目的会员很多,多达N个,尤其是才华横溢的史老师,点名要上台唱毛不易的《消愁》,但是由于场地和时间有限,只能从这N个人中选M个,请你帮会长算一算,一共有多少种选择方法?
输入描述:
数据的第一行是一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)。
输出描述:
每组数据输出一个整数,每个输出占一行。
示例1
输入
5
3 2
5 3
4 4
3 6
8 0
输出
3
10
1
0
1
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
int n,m,i,j;
long long c;
for(j=0; j<t; j++)
{
scanf("%d %d",&n,&m);
for(i=1,c=1; i<=m; i++)
{
c=c*(n+1-i)/i;
}
printf("%d\n",c);
}
return 0;
}
贴上大佬的算法
其中最重要的一步就是n!/(n-m)!*m!的变形
C:指从几个中选取出来,不排列,只组合。
C(n,m)=n*(n-1)…(n-m+1)/m!然后去计算比如说
第一次是n-m+1/11
c=1 i=1 时
第二次就是c=n-m+1n-m+1+1/2如此循环
上一篇: 排列组合算法(递归实现)
下一篇: 排列组合问题