HDU 2643 Rank(第二类斯特林数)
题意:n位人参加比赛,每个人都有一个排名,有可能有并列,最终排名有多少种情况
思路:我们可以用第二类斯特林数,枚举有多少个集合,集合的数量从1~n,所以每次用斯特林数乘以阶乘,然后加和就是最后的答案
代码:
#include <bits/stdc++.h> using namespace std; const int MOD=20090126; const int maxn=105; int s2[maxn][maxn]; int f[maxn]; void init_s2() { f[0]=1; for(int i=1;i<maxn;i++)f[i]=(long long)f[i-1]*i%MOD; for(int i=1;i<maxn;i++){ s2[i][1]=s2[i][i]=1; for(int j=2;j<i;j++){ s2[i][j]=(s2[i-1][j-1]+(long long)j*s2[i-1][j]%MOD)%MOD; } } } int main() { init_s2(); int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); int sum=0; for(int i=1;i<=n;i++){ sum=(sum+(long long)f[i]*s2[n][i]%MOD)%MOD; } printf("%d\n",sum%MOD); } return 0; }