如果K>n,就无解;
如果K==n,就答案是P(n,n);
如果K<n,答案就是s(n,K)*P(K,K);
P为排列数,s为第二类斯特林数。
第二类斯特林数就是将n个球,划分为K个非空集合的方案数(无序),所以要再乘上集合数的全排列。
#include<cstdio> using namespace std; typedef long long ll; #define MOD 1000000007ll int T,n,K; ll f[1010][1010],jc[1000010]; int main() { freopen("galactic.in","r",stdin); f[1][1]=1; for(int i=2;i<=1000;++i) for(int j=1;j<=i;++j) f[i][j]=(f[i-1][j-1]+(ll)j*f[i-1][j]%MOD)%MOD; // for(int i=1;i<=10;++i) // { // for(int j=1;j<=i;++j) // printf("%I64d ",f[i][j]); // puts(""); // } jc[0]=1; for(int i=1;i<=1000000;++i) jc[i]=jc[i-1]*(ll)i%MOD; scanf("%d",&T); for(;T;--T) { scanf("%d%d",&n,&K); if(n==K) { ll ans=1; for(int i=1;i<=K;++i) ans=ans*(ll)i%MOD; printf("%d ",(int)ans); } else if(n>K) printf("%d ",(int)(f[n][K]*jc[K]%MOD)); else puts("0"); } return 0; }