【持续更新ing】特殊组合计数

卡特兰数:

h ( n ) = h ( 0 ) ∗ h ( n − 1 ) + h ( 1 ) ∗ h ( n − 2 ) + . . . + h ( n − 1 ) ∗ h ( 0 ) ( n > = 2 ) h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2) h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)(n>=2)
另类递推式:
h ( n ) = h ( n − 1 ) ∗ ( 4 ∗ n − 2 ) / ( n + 1 ) ; h(n)=h(n-1)*(4*n-2)/(n+1); h(n)=h(n1)(4n2)/(n+1);
递推关系的解为:
h ( n ) = C ( 2 n , n ) / ( n + 1 ) ( n = 0 , 1 , 2 , . . . ) h(n)=C(2n,n)/(n+1) (n=0,1,2,...) h(n)=C(2n,n)/(n+1)(n=0,1,2,...)
前几项:
1 , 1 , 2 , 5 , 14 , 42 , 132 , 429 1, 1, 2, 5, 14, 42, 132, 429 1,1,2,5,14,42,132,429
模 板 : H D U 1134 模板:HDU1134 HDU1134









第一类斯特林数

解决问题:给n个元素,求出k个环排列的方法数
首先是递推式,有:
S ( n , k ) = ( n − 1 ) ∗ S ( n − 1 , k ) + S ( n − 1 , k − 1 ) S(n,k)=(n-1)*S(n-1,k)+S(n-1,k-1) S(n,k)=(n1)S(n1,k)+S(n1,k1)

Stirling[n][k]
1
1      1
2      3       1
6      11      6       1
24     50      35      10     1
120    274     225     85     15     1
720    1764    1624    735    175    21    1
5040   13068   13132   6769   1960   322   28   1
40320  109584  118124  67284  22449  4536  546  36  1
362880 1026576 1172700 723680 269325 63273 9450 870 45 1


const int maxn = 21;
ll Stirling[maxn][maxn], fac[maxn] = {1};
void init() {
    for(ll i = 1; i < maxn; i++)
        fac[i] = fac[i - 1] * i;
    Stirling[0][0] = 0;
    Stirling[1][1] = 1;
    for(ll i = 2; i < maxn; i++) {
        for(ll j = 1; j <= i; j++) {
            Stirling[i][j] = Stirling[i - 1][j - 1] + (i - 1) * Stirling[i - 1][j];
        }
    }
}


给 定 行 数 n , 求 第 m 行 的 第 二 类 斯 特 林 数 : 考 虑 分 治 F F T ( n l o g n 2 ) 和 倍 增 ( n l o g n ) 模 板 : 洛 谷 P 5408 , c o d e f o r c e s 960 G 给定行数n,求第m行的第二类斯特林数: 考虑分治FFT(nlogn^2)和倍增(nlogn)\\ 模板:洛谷P5408,codeforces960G nm:FFTnlogn2(nlogn)P5408codeforces960G






第二类斯特林数:

解决问题:将n个不同元素拆分成m个集合的方案数
首先是递推式,有:
S ( n , k ) = S ( n − 1 , k − 1 ) + k ∗ S ( n − 1 , k ) S(n,k)=S(n-1,k-1)+k*S(n-1,k) S(n,k)=S(n1,k1)+kS(n1,k)

Stirling[n][m]
1
1 1
1 3   1
1 7   6    1
1 15  25   10    1
1 31  90   65    15    1
1 63  301  350   140   21    1
1 127 966  1701  1050  266   28   1
1 255 3025 7770  6951  2646  462  36  1
1 511 9330 34105 42525 22827 5880 750 45 1


const int maxn = 21;
ll Stirling[maxn][maxn];
void init() {
    Stirling[0][0] = 0;
    Stirling[1][1] = 1;
    for(ll i = 2; i < maxn; i++) {
        for(ll j = 1; j <= i; j++) {
            Stirling[i][j] = Stirling[i - 1][j - 1] + j * Stirling[i - 1][j];
        }
    }
}


给 定 行 数 n , 求 第 m 行 的 第 二 类 斯 特 林 数 : 构 造 多 项 式 A ( x ) = ∑ i = 0 m ( − 1 ) i i ! x i , B ( x ) = ∑ i = 0 m i n i ! x i , C ( x ) = A ( x ) ∗ B ( x ) , C 的 第 i 项 系 数 就 是 第 二 类 斯 特 林 数 S ( n , i ) , 也 就 是 第 n 行 第 i 列 的 那 个 数 模 板 : 洛 谷 P 5395 , c o d e f o r c e s 1342 E 给定行数n,求第m行的第二类斯特林数: \\构造多项式A(x)=\sum_{i=0}^m\frac{(-1)^i}{i!}x^i,B(x)=\sum_{i=0}^m\frac{i^n}{i!}x^i,C(x)=A(x)*B(x), \\C的第i项系数就是第二类斯特林数S(n,i),也就是第n行第i列的那个数\\ 模板:洛谷P5395,codeforces 1342E nm:A(x)=i=0mi!(1)ixi,B(x)=i=0mi!inxi,C(x)=A(x)B(x),CiS(n,i)niP5395codeforces1342E






贝尔数

n个数可以划分成多少个集合
每个贝尔数都对应一行第二类斯特林数的和

1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545, 10480142147, 82864869804, 682076806159, 5832742205057, 51724158235372, 474869816156751, 4506715738447323, 44152005855084346, 445958869294805289, 4638590332229999353, 49631246523618756274

Bell[n]

ll Bell[maxn];
void init() {
    ll x[maxn];
    Bell[0] = 1LL;
    Bell[1] = 1LL;
    x[0] = 1LL;
    for(int i = 2; i < maxn; i++) {
        x[i - 1] = Bell[i - 1];
        for(int j = i - 2; j >= 0; j--)
            x[j] = (x[j]%mod + x[j + 1]%mod)%mod;
        Bell[i] = x[0]%mod;
    }
}

模 板 : 2019 I C P C 网 络 赛 ( 忘 了 哪 个 站 哪 题 了 ) 模板:2019ICPC网络赛(忘了哪个站哪题了) 2019ICPC()

你可能感兴趣的:(acm)