n个人的名次,因为有并列排名的情况,所以共n种情况,只有1个名次(所有人并列第一)到一共n个名次。对于某种情况,假设现在有x个名次,每个名次不知道多少人,就是有x个盒子,每个盒子内至少分配一个人,即n个数的集合的划分为x个非空集合方法的数目,正好是第二类斯特林数,在这里还要计数不同的排列方式,即这x个集合的不同排列。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 20090126;
const int MAXN = 110;
LL S[MAXN][MAXN];
LL fac[MAXN];
void init()
{
fac[0] = 1;
for(int i = 1; i < MAXN; ++i)
{
fac[i] = (fac[i-1]*i)%mod;
S[i][i] = 1;
S[i][0] = 0;
for(int j = 1; j < i; ++j)
S[i][j] = (j*S[i-1][j]%mod + S[i-1][j-1])%mod;
}
}
int main()
{
init();
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
LL res = 1;
for(int i = 2; i <= n; ++i)
res = (res + fac[i]*S[n][i]%mod)%mod;
printf("%I64d\n",res);
}
return 0;
}