题目链接: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 long
INT 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)。。吊吊吊。。学习!!