您的位置:首页 > 其它

UVa 12034 - Race

2014-08-13 22:09 239 查看

12034 - Race

时间限制:1.000秒

题目链接:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3185

这算是排列组合吧,然后递推……

题目第一行输入一个数字T,代表T组数据。

接下来T行每行输入一个数字n(1 ≤ n≤ 1000)。

要求算出n匹马比赛可能出现的所有情况的数量。例如n == 2时,最终名次有三种可能:并列第一,A第一,B第一。数量对10056取余。

刘汝佳《算法竞赛入门经典(第二版)》已提供思路:

设答案为f(n),设第一名有i个人,则有C(n, i)种可能性,接下来有f(n - i)种可能性,因此答案为ΣC(n, i)*f(n - i)。

这里的C(n, i)代表组合数,公式为C(n, i) = n! / ( k! * (n - k)! ),但是直接算阶乘到21就会直接超出unsigned long long的上限,所以这里用了递推的办法:

memset(C, 0, sizeof(C));
for(int i = 0; i <= 1000; ++i) {
C[i][0] = 1;
for(int j = 1; j <= i; ++j) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % 10056; // 按题意对10056取余
}


因为n ≤ 1000,所以很适合打表啊……

看到K神是程序开始前提前算一遍把结果存起来到时候直接查……我是直接用程序跑出了代码……好吧我猥琐了点……

打表的程序:

提交的代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: