题目描述
求从n个互不相同的球中取k个,一共有多少种取法。
换句话说,求C(n,k)的值
输入
输入有多组,每组输入两个数 n (1<=n<2^31) , k (0<=k<=n)。
以 0 0 为输入结束标志。
输出
输出C(n,k),数据保证结果小于2^33
示例输入
4 2
10 5
49 6
0 0
示例输出
6
252
13983816
据云飞巨巨所说,数据结果小于2^33,后面的k的值会很小,但是如果按照组合数公式计算的话,会暴long long,可以这样考虑,最后的结果是个整数,其中上边的阶乘和底下的必定会有相同的因子,我们可以采取,上边阶乘一个,我们就与下面的约分,最后把结果输出;
求从n个互不相同的球中取k个,一共有多少种取法。
换句话说,求C(n,k)的值
输入
输入有多组,每组输入两个数 n (1<=n<2^31) , k (0<=k<=n)。
以 0 0 为输入结束标志。
输出
输出C(n,k),数据保证结果小于2^33
示例输入
4 2
10 5
49 6
0 0
示例输出
6
252
13983816
据云飞巨巨所说,数据结果小于2^33,后面的k的值会很小,但是如果按照组合数公式计算的话,会暴long long,可以这样考虑,最后的结果是个整数,其中上边的阶乘和底下的必定会有相同的因子,我们可以采取,上边阶乘一个,我们就与下面的约分,最后把结果输出;
#include<stdio.h>
#include<string.h>
int bj[1000];
int main()
{
long long sum;
int n, m;
while(~scanf("%d%d",&n,&m))
{
sum = 1;
memset(bj,0,sizeof(bj));
if(m>n/2)
m=n-m;
if(n == 0 && m == 0)
break;
if(m == 0)
{
printf("1\n");
continue;
}
int i, j;
int b = m;
i = n;
while(b--)
{
sum*=i;
i--;
for(j = 2; j <= m; j++)
{
if(!bj[j] && sum%j == 0)
{
sum /= j;
bj[j] = 1;
}
}
}
printf("%lld\n",sum);
}
return 0;
}