一般的排列组合计数公式

在n个不同的元素中:

若取 r 个按次序排列, 则成为从n中取r个排列,其排列数为:P( n, r )=( n! ) / ( n-r )!  。

如取出 r 个二不考虑起次序,则称为 从n中取 r 个组合, 其组合数为:C( n, r ) = ( n! )/[ ( r! ) *( n-r )! ] 。

进行阶乘运算的数值较大, 直接计算分子和分母的话,效率低切容易溢出。

一 : 采取:连乘 r 个整商法

C( n, r ) = [ (n-r-1) / r ] * [ (n-r-2)/(r-1) ] * ..........* [ n / 1 ]  .

二: 二项式洗漱公式法

C( j, i ) =  C( j, i-1) + C(j-1, i-1 ) .

通过 i, j 的双重循环直接递推 c[i][j] ;

样题:

POJ  2249

因为常用blockcodes编译代码,所以对于大的数据类型会选择 long long,  对于这道题,用了__int64类型(因为不常用,所以不能出错)

复习一下:定义 __int64 ( 双下划线+int+64 )   输出:printf("I64d\n", a);     I64d    !!!!

Binomial Showdown

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 18112   Accepted: 5514

Description

In how many ways can you choose k elements out of n elements, not taking order into account? 
Write a program to compute this number.

Input

The input will contain one or more test cases. 
Each test case consists of one line containing two integers n (n>=1) and k (0<=k<=n). 
Input is terminated by two zeroes for n and k.

Output

For each test case, print one line containing the required number. This number will always fit into an integer, i.e. it will be less than 231
Warning: Don‘t underestimate the problem. The result will fit into an integer - but if all intermediate results arising during the computation will also fit into an integer depends on your algorithm. The test cases will go to the limit.

Sample Input

4 2
10 5
49 6
0 0

Sample Output

6
252
13983816

Source

Ulm Local 1997

采用 分整式连乘的方法

C ( n, k ) = (n-k+1)/k  *   (n-k+2)/(k-1)  * ......  * ( n)/1  .

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

__int64 work(__int64 n, __int64 k)
{
	if(k>n/2)
		k = n-k; //减少枚举量(剪枝)
	__int64 a=1, b=1; //代表分子和分母
	int i;
	for(i=1; i<=k; i++)  //循环k次运算
	{
		a=a*(n-i+1); //分子
		b=b*i;
		if(a%b==0) //说明能整除,进行整数商处理
		{
			a=a/b;
			b=1;
		}
	}
	return a/b;
}

int main()
{
	int n, k;
	while(scanf("%d %d", &n, &k)!=EOF)
	{
		if(n==0  )
		{
			break;
		}
		printf("%I64d\n", work(n, k) );
	}

	return 0;
}

  

时间: 2024-07-28 12:26:59

一般的排列组合计数公式的相关文章

POJ 2249-Binomial Showdown(排列组合计数)

Binomial Showdown Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18457   Accepted: 5633 Description In how many ways can you choose k elements out of n elements, not taking order into account? Write a program to compute this number. Inp

排列组合或容斥原理

题目链接:https://vjudge.net/contest/237052#problem/H Here we go! Let's define the diversity of a list of numbers to be the difference between the largest and smallest number in the list. For example, the diversity of the list (1, -1, 2, 7) = 7 - (-1) = 8

排列组合的一些公式及推导

排列数公式 \[A_n^m=n(n-1)(n-2)\cdots(n-m+1)=\frac{n!}{(n-m)!}\] (规定\(0!=1\)) 推导:把\(n\)个不同的元素任选\(m\)个排序,按计数原理分步进行: 取第一个:有\(n\)种取法: 取第二个:有\((n-1)\)种取法: 取第三个:有\((n-2)\)种取法:? -- 取第\(m\)个:有\((n-m+1)\)种取法: -- 最后一步,取最后一个:有\(1\)种取法. 根据分步乘法原理,得出上述公式. 组合数公式 \[C_n^m

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

排列组合公式

今天在写一个算法的时候用到了排列组合,突然感觉不熟悉了,于是自己搜索了下, 重新复习下,把笔记记下来,便于以后复习. 第一,排列 1)排列的定义,就是指从给定n个数的元素中取出指定r个数的元素,进行排序 2)排列公式 3 公式解读, 总长度为r,第一个人有n-0种选,第二个有n-1种,,,,最后一个有n-(r-1)种(为什么是减去(r-1) 因为到第r个人的时候,发现自己前面有r-1个人已经消耗了r-1个选择了,自己的选择余地变成n-(r-1),这和第一个人发现前面有0个选择已经消耗是一样道理)

杭电 2200 Eddy&#39;s AC难题 (排列组合 公式)用double来表示64位

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3710    Accepted Submission(s): 1741 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的

简明易懂的理解排列组合公式

说实话,我可能无意识中总是感觉自己数学不好,有时自己稍微陌生的数学内容就尽量的逃避,这哪能行,必须要去面对的.我又不是搞数学的研究,咱只是去应用就行了. 下面是知乎降解排列组合公式比较透彻的一个帖子 https://www.zhihu.com/question/26094736

概率论1 计数-排列-组合

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 概率 概率论研究随机事件.它源于赌徒的研究.赌博中有许多随机事件,比如投掷一个骰子,是否只凭运气呢? 赌徒逐渐发现随机事件的规律.投掷两个骰子是常见的赌博游戏.如果重复很多次,那么总数为2的次数会比总数7的次数少.这就是赌徒把握到的规律:尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."

【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一位同学的一门必修课分数不同时视为两种情况不同.n,m<=100,Ui<=10^9. [算法]计数DP+排列组合+拉格朗日插值 [题解]把分数作为状态不现实,只能逐门课考虑. 设$f[i][j]$表示前i门课,有j个同学被碾压的情况数,则有: $$f[i][j]=g(i)\cdot\sum_{k=j