Binomial Showdown
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 15158 | Accepted: 4629 |
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.
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.
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.
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
题目很简单,有n个数字,取其中m个数字的个数。
解法有两种
1)用double直接计算。
2)上下同时约分,取值。
注意点:
1)输出时必须将变量的类型改成%lld或者%ld.不可以用%.0lf输出(3WA 1RE)
2)必须判断m是否大于n/2,如果是则赋值为n - m。否则超时(1TLE)。
代码
1)double计算法
(1AC 3WA 1TLE):
#include <cstdio>
#include <cstdlib>
int main(void){
int n, k;
long long result;
int i, j;
double tmp1, tmp2;
while (scanf("%d%d", &n, &k), n != 0 || k != 0)
{
if (k > n / 2){
k = n - k ;
}
for (i = n, tmp1 = 1; i > n - k; i--){
tmp1 *= i;
}
for (i = k, tmp2 = 1; i >= 1; i--){
tmp2 *= i;
}
result = tmp1 / tmp2;
printf("%lld\n", result);
}
return 0;
}
2)上下同时约分法(1AC):
#include <stdio.h>
int n, k;
int num[256];
int max(int a, int b){
return a>b?a:b;
}
int gcd( int a, int b){
return (b==0?a:gcd(b, a%b));
}
int main(){
while (scanf("%d%d", &n, &k), n||k) {
int i, j, g, temp, sum=1, times;
int m= max(k, n-k);
for ( i = 0; m+i < n; i++){
num[i]=m+i+1;
}
times= n-m;
while(i>1){
temp=i;
for ( j = 0; j < times; j++ ){
if (1 == temp){
break;
}
g=gcd(num[j], temp);
num[j]/=g;
temp/=g;
}
i--;
}
for ( i = 0; i < times; i++){
sum*=num[i];
}
printf("%d\n", sum);
}
return 0;
}