您的位置:首页 > 其它

poj2249 Binomial Showdown(二项式系数)

2017-03-16 21:59 375 查看
http://poj.org/problem?id=2249

题意:求组合数C(n,k),最后的结果超大可能是2^31。

思路:刚开始本来想把前些日子的dp法复习下,结果RE。2^31至少要开10000*10000的二维数组,行不通。。

后来就想,其实这题有个很简单的方法,很久以前也碰到过类似的问题。

C(n,k) = n!/(k!*(n-k)!)。我们知道n!有n项,k!有k项,(n-k)!有n-k项。分子分母都有n项啊!为了统一我们把(n-k)!约掉,分子分母只剩k项了啊,一个for搞定。

同时乘一个数再除一个数保证不会太大溢出,记得转化成double。

。。。

于是就陷入无限WA,不要用G++。。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <iostream>

using namespace std;

typedef long long ll;
const int N = 2005;
const int INF = 0x3f3f3f3f;

int main()
{
// freopen("in.txt", "r", stdin);
int n, k;
double ans;
while(~scanf("%d%d", &n, &k))
{
if(n==0 && k==0) break;
if(k > n-k) k = n-k;
if(k == 0)
{
printf("1\n");
continue;
}
ans = 1;
for(int i = 0; i < k; i++)
{
ans*=((double)(n-i)/(double)(k-i));
}
printf("%.0lf\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj