题意:有一种锁,由B个数字构成。锁会选取<=B的数字分成任意份,然后份与份之间可以任意排列,求这种锁的种数。
题解:枚举选从B个中选i个,然后在枚举i分成j份的方法,分成j份的方法即斯特林数,最后再乘以j的全排。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 typedef long long LL; 5 LL s[12][12],c[12][12],f[12]; 6 int main() 7 { 8 s[0][0]=1; 9 c[0][0]=1; 10 f[0]=1; 11 for(int i=1; i<=11; i++) 12 { 13 f[i]=f[i-1]*i; 14 s[i][0]=0; 15 s[i][i]=1; 16 c[i][0]=c[i][i]=1; 17 for(int j=1; j<i; j++) 18 { 19 s[i][j]=s[i-1][j-1]+j*s[i-1][j]; 20 c[i][j]=c[i-1][j-1]+c[i-1][j]; 21 } 22 } 23 int T,n,ca=0; 24 for(scanf("%d",&T); T; T--) 25 { 26 scanf("%d",&n); 27 LL ans=0; 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=i;j++) 30 ans+=c[n][i]*s[i][j]*f[j]; 31 printf("%d %d %lld\n",++ca,n,ans); 32 } 33 return 0; 34 }