https://codeforces.com/gym/326694/problem/G
假设要把n+1个元素分成m个集合则分析如下:
1.如果n个元素构成了m-1个集合,那么第n+1个元素单独构成一个集合。
方案数m×S(n,m-1)。
2.如果n个元素已经构成了m个集合,将第n+1个元素插入到任意一个集合。
方案数 m×S(n,m) 。
注意有特殊情况:
1.如果只有一个集合,那方案数只有一种。
2.如果元素个数n等于集合数,那么它是一个n的全排列,如果要再加一个单个元素的新集合,应该乘n+1。
#include<bits/stdc++.h>
using namespace std;
long long mod=1e9+7;
long long dp[1100][1100];//i为人数,j为集合数
int main(){
freopen("galactic.in", "r", stdin);
for(int i=1;i<=1000;i++){
for(int j=1;j<=i;j++){
if(j==1)dp[i][1]=1;
else if(i==j)dp[i][j]=dp[i-1][j-1]*i;
else dp[i][j]=j*dp[i-1][j-1]+j*dp[i-1][j];
dp[i][j]%=mod;
}
}
int n,a,b;
cin>>n;
while(n--){
cin>>a>>b;
if(a<b){
cout<<0<<endl;
continue;
}else{
cout<<dp[a][b]<<endl;
}
}
//system("pause");
return 0;
}