Analysis
枚举总共的名次 i ,将 n 个人分到 i 个非空集合中 <–裸的第二类斯特林数
然后对于每一种方案还需要乘以 i 的全排列
a
n
s
=
Σ
i
=
1
n
S
2
(
n
,
i
)
∗
i
!
ans=\Sigma_{i=1}^{n}S2(n,i)*i!
ans=Σi=1nS2(n,i)∗i!
Code
#include<bits/stdc++.h>
#define re register
using namespace std;
typedef long long ll;
const int P=20090126;
ll S2[105][105],fac[105];
inline void pre_work(){
fac[0]=1;
for(re int i=1;i<=100;++i) {
fac[i]=fac[i-1]*i%P;
S2[i][i]=S2[i][1]=1;
for(re int j=2;j<i;++j)
S2[i][j]=(S2[i-1][j-1]+S2[i-1][j]*j%P)%P;
}
}
int main(){
int T;
scanf("%d",&T);
pre_work();
while(T--){
int n;
ll ans=0;
scanf("%d",&n);
for(re int i=1;i<=n;++i){
ans=(ans+S2[n][i]*fac[i]%P)%P;
}
cout<<ans<<'\n';
}
return 0;
}