欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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+1
n-m+1+1/2如此循环