poj 2249 Binomial Showdown[C(n, m)组合数求解]

来源:互联网 发布:ida远程调试linux 编辑:程序博客网 时间:2024/05/21 12:50

题目链接:http://poj.org/problem?id=2249

题目的意思就是求个C(n, m)组合数。

数据保证结果不超过2^31。。但是,中间过程中的数据可能超过long long。

这里用到了一个技巧。。边乘边除。。。可以避免中间的数据超过long long。。

还有就是用到组合公式中的一个常用公式。。C(n, m) = C(n, n - m)。。。可以避免超时。。

表示学习了。。ORZ。。。

Code:

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define INT unsigned long longINT C(INT n, INT m){    INT ans = 1;    for(INT i = n; i >= n - m + 1; i --){        ans = ans * i;        ans = ans / (n - i + 1);    }    return ans;}int main(){    INT n, m;    while(cin >> n >> m&& (n || m)){       cout << C(n, min(m, n - m)) << endl;    }    return 0;}

------>

水水的组合求C(n, m)。。吊吊吊。。学习!!奋斗

0 0