【第二类Stirling数】Gym

如果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;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/6347780.html