Rank HDU

Rank

 HDU - 2643 

题意:n个人比赛,问最后的排名有多少种情况。

第二类斯特林数~

最后可能有i个名次(因为有并列),所以我们把n个人分成i个集合,s2(n,i),然后这i个集合再全排列。 i = 1,2,3,……,n.

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int mod = 20090126;
 5 const int maxn = 105;
 6 ll s2[maxn][maxn], f[maxn];
 7 void init(){
 8     for(int i = 1; i < maxn; i++) {
 9         s2[i][1] = s2[i][i] = 1;
10         for(int j = 2; j < i; j++) {
11             s2[i][j] = (s2[i-1][j-1] + j*s2[i-1][j]) % mod;
12         }
13     }
14     f[1] = 1;
15     for(int i = 2; i < maxn; i++) f[i] = f[i-1] * i % mod;
16 }
17 int main(){
18     int n;
19     int t;
20     scanf("%d", &t);
21     init();
22     while(t--) {
23         scanf("%d", &n);
24         ll ans=0;
25         for(int i = 1; i <= n; i++) ans = (ans + f[i]*s2[n][i]%mod) % mod;
26         printf("%lld
", ans);
27     }
28 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7602249.html