Rank
题意:n个人比赛,问最后的排名有多少种情况。
第二类斯特林数~
最后可能有i个名次(因为有并列),所以我们把n个人分成i个集合,s2(n,i),然后这i个集合再全排列。 i = 1,2,3,……,n.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }