题意:给定n个人,要求这n个人的所有可能排名情况,可以多个人并列(这个是关键)。
题解:由于存在并列的问题,那么对于n个人,我们最多有n个排名,枚举一下1~n,累加一下就好。(注意这里是变种的斯特林数——每个子集合是可互相区分的)。
ac代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll s[110][110]; ll f[110]; const ll mod=20090126; void init() { for(int i=1;i<=100;i++) s[i][i]=1,s[i][0]=0; for(int i=1;i<=100;i++) { for(int j=1;j<=i-1;j++) { s[i][j]=(j*s[i-1][j]+s[i-1][j-1])%mod; } } f[0]=1; f[1]=1; for(int i=2;i<=100;i++) f[i]=(f[i-1]*i)%mod; } int main() { init(); //cout<<s[3][2]<<endl; int t; cin>>t; while(t--) { ll x; cin>>x; ll sum=0; for(int i=1;i<=x;i++) { sum=(sum+f[i]*s[x][i])%mod; } cout<<sum<<endl; } return 0; }