HDU 6143 Killer Names [第二类斯特林数]

题意:给你m个不同的字符,用这些字符组合first name和last name,要求first name和last name中字符完全不相同,求有几种组合。

题解:第二类斯特林数,枚举i(1<=i<=m)个字符填入长度为n的串,我们先枚举 first name 的情况,再枚举last name 的情况 相乘就能得到答案。

定理:第二类Stirling数S(n,k)计数的是把n元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数。

证明:元素在拿些盒子并不重要,唯一重要的是各个盒子里装的是什么,而不管哪个盒子装了什么。

递推公式有:

HDU 6143 Killer Names [第二类斯特林数]_第1张图片

直接计算S(n,k):



考虑将前p个正整数,1,2,.....p的集合作为要被划分的集合,把{1,2,.....p}分到k个非空且不可区分的盒子的划分有两种情况:
(1)那些使得p自己单独在一个盒子的划分,存在有S(p-1,k-1)种划分个数
(2)那些使得p不单独自己在一个盒子的划分,存在有 k*S(p-1,k)种划分个数

考虑第二种情况,p不单独自己在一个盒子,也就是p和其他元素在一个集合里面,也就是说在没有放p之前,有p-1个元素已经分到了k个非空且不可区分的盒子里面(划分个数为S(p-1,k),那么现在问题是把p放在哪个盒子里面呢,有k种选择,所以存在有k*S(p-1,k)。


AC代码:

#include
#include
#include
#include
#include
#define mod 1000000007
#define maxn 2005
using namespace std;
typedef long long ll;
ll n,m,C[maxn][maxn],S[maxn][maxn];
void init()
{
    for(ll i=0;i


你可能感兴趣的:(hdu,多校,第二类斯特林数,递推,HDU,第二类斯特林数)