组合数:
k * C(n, k) = n * C(n - 1, k - 1);
C(n, 0) + C(n, 2) + … = C(n, 1) + C(n, 3) + …
1 * C(n, 1) + 2 * C(n, 2) + … + n * C(n, n) = n * 2^(n - 1)
C(n,m) = C(n-1,m-1) + C(n-1,m)(杨辉三角递推式)
Catalan数:
前几项:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670,129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452
相关:出栈序列!!!
递归公式1
f(n)=∑n−1i=0f(i)∗f(n−i−1)
递归公式2
f(n)=f(n−1)∗(4∗n−2)n+1
这个公式不错,O(N)的递推。
组合公式1
f(n)=Cn2nn+1
O(1)的
组合公式2
f(n)=Cn2n−Cn−12∗n
这四个公式了解即可
最后一个,最重要的公式,必须要掌握的公式!!
递推公式
f[n]=∑n−1i=0f[i]∗f[n−i−1]
但是这个递推是N^2的
//两种写法,利弊自己试试
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
LL fac[50];
/*int main(int argc,char *argv[]) {
fac[0] = fac[1] = 1;
for(int i=2; i<=36; ++i) fac[i] = fac[i - 1] * i;
int n;
cin >> n;
cout << (fac[n * 2] / (fac[n] * fac[n])) / (n + 1);
}*/
int main(int argc,char *argv[]) {
int n; cin >> n;
fac[0] = fac[1] = 1;
for(int i=2; i<=n; ++i)
for(int j=0; j<i; ++j)
fac[i] += fac[j] * fac[i - j - 1];
cout << fac[n];
}
Stirling数 · 1
s(p, k)是将p个物体排成k个非空的循环排列的方法数(或者: 把p个人排成k个非空圆圈的方法数)。
s(p, k) = (p - 1) * s(p - 1, k) + s(p - 1, k - 1);
Stirling数 · 2
S(p, k) = k * S(p - 1, k) + S(p - 1, k - 1).
S(p, 0) = 0, (p >= 1);
S(p, p) = 1, (p >= 0);
且有 S(p, 1) = 1, (p >= 1);
S(p, 2) = 2^(p - 1) - 1, (p >= 2);
S(p, p - 1) = C(p, 2);