POJ_2249

来源:互联网 发布:win10 软件兼容 编辑:程序博客网 时间:2024/05/16 06:23
Binomial Showdown
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14435 Accepted: 4403

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 210 549 60 0

Sample Output

625213983816
题目大意就是从n个数中取k个数的情况种数,就是求C(n,k);
刚开始时用递推,RE了几次,最后改成数组来,但有些细节没注意到,WA了几次,总的说来,这是一道比较简单的组合数学的基本功是的运用
排列组合的基本公式:

Pascal公式

和一些恒等式

要解答出这道题主要运用的就是恒等式(1)

我的提交情况

参考代码:

复制代码
 1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 __int64 a[ 100000000]; 9 int main()10 {11 12     __int64 m , n ;13     while ( scanf("%I64d%I64d",&m,&n), m || n )14     {15         a[0]=1;16         if ( n > m / 2 )17             n = m - n ;18         19         for ( int i = 1; i <= n ; i ++ )20             a[i] = a[i-1] * ( m - i + 1 ) / i ;21         printf("%I64d\n", a[n] );22     }23     return 0;24 }
复制代码
本文转自:http://www.cnblogs.com/ACShiryu/
0 0
原创粉丝点击