排列组合计算

题目:有多少种方法可以从n个元素中不考虑顺序地选择k个元素?请编写一个程序来计算这个数字

思路:直接使用组合数公式C_{n}^{k}=\frac{n!}{(n-r)!}=\frac{n-r+1}{r}\cdot \frac{n-r+2}{r-1}...\frac{n}{1}

由于测试用例的case数据比较大,所以不能直接算阶乘,而是转换成r个分数相乘。由于每个分式可以约简,因此不会出现溢出的情况。

但是有一个坑点就是在OJ上提交显示超时,后来问了别人才知道,C^{_{n}^{k}}=C^{_{n}^{n-k}},因此当k>n/2时,可以化为C^{_{n}^{n-k}}.

最后的返回值要定义为long long 类型,否则会溢出

贴上最终AC的代码

#include 
typedef long long int64;

int n, r;
int64 get(){
	int64  ans = 1;
	int64 b = 1;
	if(r > n-r) r = n-r;
	for(int i = 1; i <= r; ++i){
		ans = ans * (n-r+i);
		b = b*i;
		if(ans % b == 0){
			ans = ans/b;
			b = 1;
		}

	}
	return ans/b;
} 

//分数约简
 
int main(){
	while(~scanf("%d %d", &n, &r)&&n){
		printf("%lld\n", get());
	}
	return 0;
}

 

你可能感兴趣的:(排列组合计算)