首页 > 代码库 > 排列组合

排列组合

H - 掉了你 列组
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Submit Status

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 2 31
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
化简:C(a,b) = C(a,a-b);
因为a的乘方次数 == b的乘方次数 ,所以可以两者同时进行
因为b从1开始,所以对于【a/i*(a-1)】|(i+1) 一定成立。
#include<stdio.h>
int main(){
	int m1,n;
	while(scanf("%d%d",&m1,&n),m1|n){
		__int64 s =1;
		int m = 1;
		int k = m1-n>n?m1-n:n;
		for(int i = m1;i>k;i--){
			s = s*i/m;
			m++;
		}
		printf("%I64d\n",s);
	}
}


排列组合