组合数学

组合基础与数论基础

组合数

Lucas 定理

\\\forall n,m,\\in\\mathbb{N},n\\geq m,p\\in\\mathbb{P}, \\binom{n}{m} \\equiv \\binom{\\lfloor n/p\\rfloor}{\\lfloor m/p\\rfloor} \\binom{n \\bmod p}{m \\bmod p} \\pmod{p} \\

证明:

引理:\(\forall p\in\mathbb{P},n\in1,p-1\cap\mathbb{Z},\binom{p}{n} \equiv 0 \pmod{p}\)

\(\because p\in\mathbb{P},\therefore\binom{p}{x}\equiv\frac{p!}{x!(p-x)!}\equiv p \cdot \frac{(p-1)!}{x!(p-x)!} \equiv 0 \pmod p\)。证毕。

有 \((1+x)^p\equiv\sum\limits_{i=0}^{p}{\binom{p}{i}x^i}\equiv 1+\sum\limits_{i=1}^{p-1}{\binom{p}{i}x^i}+x^p\equiv{1+x^p}\pmod p\)。

设 \(\begin{cases} q_n = \lfloor\frac{n}{p}\rfloor \\ r_n = n \bmod p \\ q_m = \lfloor\frac{m}{p}\rfloor \\ r_m = m \bmod p \end{cases}\),由取模定义可知 \(\begin{cases} q_np+r_n=n \\ q_mp+r_m=m \\ \end{cases}\)。

\\\begin{aligned} \& (1+x)\^n \\\\ \& \\equiv (1+x)\^{q_np+r_n} \\\\ \& \\equiv (1+x)\^{q_np} \\cdot (1+x)\^{r_n} \\\\ \& \\equiv (1+x\^p)\^{q_n} \\cdot (1+x)\^{r_n} \\\\ \& \\equiv (\\sum\\limits_{i=0}\^{q_n}{\\binom{q_n}{i}x\^{ip}})\\cdot(\\sum\\limits_{i=0}\^{r_n}{\\binom{r_n}{i}x\^i}) \\\\ \& \\equiv \\sum\\limits_{i=0}\^{q_n}\\sum\\limits_{j=0}\^{r_n}{\\binom{q_n}{i}\\binom{r_n}{j}x\^{ip+j}} \\end{aligned} \\

又 \((1+x)^n=\sum\limits_{i=0}^{n}{\binom{n}{i}x^i}\)

所以 \(\sum\limits_{i=0}^{n}{\binom{n}{i}x^i} \equiv \sum\limits_{i=0}^{q_n}\sum\limits_{j=0}^{r_n}{\binom{q_n}{i}\binom{r_n}{j}x^{ip+j}} \pmod p\)

设 \(k = i \cdot p + j\),因为 \(0 \leq j < r_n\),所以 \(i = \lfloor\frac{k}{p}\rfloor, j = k \bmod p\)

则 \(\sum\limits_{i=0}^{n}{\binom{n}{i}x^i} \equiv \sum\limits_{i=0}^{q_n}\sum\limits_{j=0}^{r_n}{\binom{q_n}{\lfloor\frac{k}{p}\rfloor}\binom{r_n}{k \bmod p}x^{k}} \pmod p\)

因为 \(n\geq m\),则对于左式有 \(i=m\) 时,右式有 \(k=m\) 时,即有 \(\binom{n}{m}x^m\equiv\binom{q_n}{\lfloor\frac{m}{p}\rfloor}\binom{r_n}{m \bmod p}x^m \pmod p\),因为 \(\begin{cases}q_n = \lfloor\frac{n}{p}\rfloor \\ r_n = n \bmod p\end{cases}\),即得 \(\binom{n}{m}\equiv\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\binom{n \bmod p}{m \bmod p}\pmod p\)。证毕。

扩展Lucas exLucas

给定正整数 \(n,m,P,1\leq m \leq n \leq 10^{18},1\leq P \leq 10^6\),求

\\\binom{n}{m} \\bmod P \\

\(\text{exLucas}\) 和 \(\text{Lucas}\) 定理并无多大关系,\(\text{exLucas}\) 我认为是一种算法。

学习 \(\text{exLucas}\) 之前建议看看阶乘质因数分解

\(P\) 不为质数,将 \(P\) 质因数分解 \(P = \prod\limits{p_i^{c_i}}\)。

将 \(\binom{n}{m}\) 对每个 \(p^c\) 取模,得出若干同余方程,利用中国剩余定理求出答案:

\(\begin{cases} \binom{n}{m} \equiv a_1 \pmod {p_1^{c_1}} \\ \binom{n}{m} \equiv a_1 \pmod {p_1^{c_1}} \\ \binom{n}{m} \equiv a_1 \pmod {p_1^{c_1}} \\ \cdots \\ \binom{n}{m} \equiv a_1 \pmod {p_{w}^{c_{w}}} \\ \end{cases}\)

关键在于计算 \(\binom{n}{m} \bmod {p^c}\)。

\(\binom{n}{m} = \frac{n!}{m!(n-m)!} \pmod {p^c}\)

有除法,但是 \(m!(n-m)!\) 不一定和 \(p^c\) 互质,即可能无法求出其逆元。

一个方法是将 \(m!(n-m)!\) 的因子 \(p\) 都除去,使之与 \(p^c\) 互质:

\(\frac{n!}{m!(n-m)!} \equiv \frac{\frac{n!}{p^x}}{\frac{m!}{p^y} \cdot \frac{(n-m)!}{p^z}} \cdot p^{x-y-z}\),\(x\) 就是 \(n!\) 质因数分解后 \(p\) 的指数,\(y,z\) 同理。


\(n! = 1 \times 2 \times 3 \times \dots \times n\) 这 \(n\) 个数当中有 \(\lfloor\frac{n}{p}\rfloor\) 个数是 \(p\) 的倍数,因为每 \(p\) 个数就有一个数是 \(p\) 的倍数。

则 \(n! = \lfloor\frac{n}{p}\rfloor! \cdot p \cdot \prod\limits_{\substack{1\leq i\leq n\\ p\nmid i}}{i}\),\(\lfloor\frac{n}{p}\rfloor!\) 里可能有 \(p\) 的倍数,可以递归地来求。

设 \(f(n) = \frac{n!}{p^x} \bmod p^c\),有 \(f(n) = f(\lfloor\frac{n}{p}\rfloor) \cdot \prod\limits_{\substack{1\leq i\leq n\\ p\nmid i}}{i} \bmod p^c\),没有 \(\times p\) 的原因是分母是 \(p^x\),\(p\) 都被约掉了。

\\\prod\\limits_{\\substack{1\\leq i\\leq n\\\\ p\\nmid i}}{i}=(\\prod\\limits_{\\substack{\\lfloor\\frac{n}{p\^c}\\rfloor+1 \\leq i \\leq n\\\\ p \\nmid i}}{i})(\\prod\\limits_{0\\leq i \\leq \\lfloor\\frac{n}{p\^c}\\rfloor-1}\\prod\\limits_{\\substack{1\\leq j\\leq p\^c\\\\ p\\nmid j}}(i \\cdot p\^c + j)) \\pmod{p\^c} \\

发现 \(i \cdot p^c + j \equiv j \pmod {p^c}\)

\\\prod\\limits_{\\substack{1\\leq i\\leq n\\\\ p\\nmid i}}{i} \\equiv (\\prod\\limits_{\\substack{\\lfloor\\frac{n}{p\^c}\\rfloor+1 \\\\ p \\nmid i} \\leq i \\leq n}{i})(\\prod\\limits_{0\\leq i \\leq \\lfloor\\frac{n}{p\^c}\\rfloor p\^c -1}{i}\\prod\\limits_{\\substack{1\\leq j\\leq p\^c\\\\ p\\nmid j}}j) \\equiv (\\prod\\limits_{\\substack{\\lfloor\\frac{n}{p\^c}\\rfloor p\^c+1 \\\\ p\\nmid i} \\leq i \\leq n}{i})(\\prod\\limits_{\\substack{1\\leq j\\leq p\^c\\\\ p\\nmid j}}j)\^{\\lfloor\\frac{n}{p\^c}\\rfloor} \\pmod{p\^c} \\

\f(n) = f(\\lfloor\\frac{n}{p}\\rfloor) \\cdot (\\prod\\limits_{\\substack{\\lfloor\\frac{n}{p\^c}\\rfloor p\^c+1 \\\\ p\\nmid i} \\leq i \\leq n}{i})(\\prod\\limits_{\\substack{1\\leq j\\leq p\^c\\\\ p\\nmid j}}j)\^{\\lfloor\\frac{n}{p\^c}\\rfloor} \\pmod{p\^c} \\

调用一次 \(f\) 的时间复杂度为 \(O(\) 递归次数 \(\times(\) 积式 \(+\) 快速幂 \())=O(\log_pn \cdot (p^c + \log_2\lfloor\frac{n}{p^c}\rfloor)) = O(p^c\log + \log^2)\)


现在问题在于求 \(x,y,z\)。

设 \(g(n)=x\),有 \(g(n)=g(\lfloor\frac{n}{p}\rfloor) + \lfloor\frac{n}{p}\rfloor\)。

\(n! = 1 \times 2 \times 3 \times \cdots \times n\),这 \(n\) 个数中是 \(p\) 的倍数显然有 \(\lfloor\frac{n}{p}\rfloor\) 个,将这 \(\lfloor\frac{n}{p}\rfloor\) 个数 \(\times \frac{1}{p}\) 在相乘可得 \(\lfloor\frac{n}{p}\rfloor!\),即 \(g(\lfloor\frac{n}{p}\rfloor)\),所以 \(g(n)=g(\lfloor\frac{n}{p}\rfloor) + \lfloor\frac{n}{p}\rfloor\)。


综上,\(\text{exLucas}\) 有以下步骤:

  1. 质因数分解 \(P = \prod\limits{p_i^{c_i}}\),时间复杂度 \(O(\sqrt{P})\),但是有效 \(p_i^{c_i}\) 最多有 \(O(7)\)

  2. 计算 \(\binom{n}{m} \bmod p_i^{c_i}\),时间复杂度 \(O(p^c\log + \log^2)\)

    \(\binom{n}{m} = \frac{\frac{n!}{p^x}}{\frac{m!}{p^y}\frac{(n-m)!}{p^z}}\cdot p^{x-y-z} \equiv f(n) \cdot f(m)^{-1} \cdot f(n-m)^{-1} \cdot p^{g(n)-g(m)-g(n-m)} \pmod{p^c}\)

  3. 用中国剩余定理求出方程组的解,即为答案。时间复杂度 \(O(7 \cdot \log n)\)

步骤 2. 的 \(p^c\) 最坏为 \(P\)。

关于 1. 3. 时间复杂度为什么和 \(7\) 有关,因为方程的个数即为 \(P\) 不同质因数的个数,最坏情况为 \(P = 2 \times 3 \times 5 \times 7 \times 11 \times 13 \times 17\),\(2 \times 3 \times 5 \times 7 \times 11 \times 13 \times 17 \times 19 > 10^6\)。

1.2. 是嵌套关系,1.2. 执行完执行 3. ,则总时间复杂度为 \(O(\sqrt{P} + 7 \cdot (P\log + \log^2) + 7\log n) = O(\sqrt{P} + P\log)\)。

例题 SDOI2010古代猪文

Luogu SDIO2010古代猪文

给定整数 \(q,n\),\(1\leq q,n \leq 10^9\),计算

\q\^{\\sum_{d\|n}{C\^{d}_{n}}}\\bmod 999911659 \\

若 \(q=999911659\),则答案为 \(0\)。

若 \(q\neq 999911659\),根据欧拉定理推论有:\(q^{\sum_{d|n}{C^{d}{n}}}\equiv q^{\sum{d|n}{C^{d}_{n}}\bmod 999911658}\pmod {999911659}\)。

关键在于计算 \(\sum_{d|n}{C^{d}_{n}}\bmod 999911658\),模数不是质数,不能应用 \(\text{Lucas}\) 定理,尝试将其质因数分解。

\(999911658 = 2 \times 3 \times 4679 \times 35617\),这样的数为 \(\text{square-free-number}\),它的所有质因子质数都是 \(1\)。设 \(x = C^{d}_{n}\),用这四个质因数分别运用 \(text{Lucas}\) 定理给 \(x\) 取模,可得:

\(\begin{cases} x\equiv a_1 \pmod 2 \\ x\equiv a_2 \pmod 3 \\ x\equiv a_3 \pmod {4679} \\ x\equiv a_4 \pmod {35617} \\ \end{cases}\)

用中国剩余定理求出 \(x\),然后用快速幂求出 \(q^{\sum{x}}\bmod 999911658\),即可。

时间复杂度为 \(O(\)快速幂 \(+\) 求因数 \(\times(\text{Lucas}\) 定理 \(+\) 中国剩余定理\())=O(\log+\sqrt{n}(\log+\log))=O(\sqrt{n}\log)\)。

求法

求 \(\binom{n}{m} \bmod p, p\in\mathbb{P}\)

方法 \(1\):

通过 \(\binom{n}{m} = \binom{n - 1}{m} + \binom{n - 1}{m - 1}\) 求组合数,时间复杂度 \(O(n^2)\),回答时间复杂度 \(O(1)\)。


方法 \(2\):

预处理 \(0\sim n\) 的阶乘和阶乘的逆元,时间复杂度 \(O(n)\),回答时间复杂度 \(O(1)\)。


方法 \(3\):

利用 \(\text{Lucas}\) 定理,预处理 \(0\sim p-1\) 的阶乘和阶乘的逆元,时间复杂度 \(O(p)\),回答时间复杂度 \(O(log_p(n))\)。


方法 \(4\):

求 \(\binom{n}{m}, n\leq 5000, m\leq 5000, n\geq m\)。

注意,没有取模,需要用到高精度。

利用 \(\binom{n}{m} = \binom{n - 1}{m} + \binom{n - 1}{m - 1}\) \(O(n^2)\) 做貌似可以,但是要用到高精度,还有 \(O(n)\) 的位数,则时间复杂度 \(O(n^3)\)。

唯一分解即质因数分解

根据定义式 \(\binom{n}{m} = \frac{n!}{m!(n-m)!}\) 来做,又因为组合数一定是个整数,所以我们用不到高精度除法,对分子和分母唯一分解,分子的每个质数的指数一定大于等于分母的对应指数,若小于则 \(m!(n-m)!\) 不整除 \(n!\),与组合数是整数矛盾。

综上步骤为:

  • 对 \(n!,m!,(n-m)!\) 唯一分解。
  • 约分,即用 \((n-m)!,m!\) 唯一分解出的质数消 \(n!\) 唯一分解出的质数。
  • 高精度 \(\times\) 低精度

对 \(x!\) 质因数分解

代码实现:

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;


const int N = 5010;

int primes[N], cnt;
int sum[N];
bool st[N];


void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}


int get(int n, int p) // 求n!中 质因子 p 需要累乘的次数 
{
    int res = 0;
    while (n)
    {
        res += n / p;
        n /= p;
    }
    return res;
}


vector<int> mul(vector<int> a, int b)
{
    vector<int> c;
    int t = 0;
    for (int i = 0; i < a.size(); i ++ )
    {
        t += a[i] * b;
        c.push_back(t % 10);
        t /= 10;
    }
    while (t)
    {
        c.push_back(t % 10);
        t /= 10;
    }
    return c;
}


int main()
{
    int a, b;
    cin >> a >> b;

    get_primes(a);//用欧拉筛筛出 [1~a] 范围内的质数 

    for (int i = 0; i < cnt; i ++ )
    {
        int p = primes[i];
        sum[i] = get(a, p) - get(a - b, p) - get(b, p); // C(a,b) 中第 i 个质数需要累乘的次数 
    }

    vector<int> res;
    res.push_back(1);

    for (int i = 0; i < cnt; i ++ ) // 枚举质因子 
        for (int j = 0; j < sum[i]; j ++ ) // 枚举当前质因子的个数 
            res = mul(res, primes[i]); // 做高精度乘低精度 

    for (int i = res.size() - 1; i >= 0; i -- ) printf("%d", res[i]);
    puts("");

    return 0;
}

一些基本式子

式子1

\\\binom{n}{m}=\\binom{n}{n - m} \\

证明:由定义即可得。

它的组合意义是从 \(n\) 个数中选 \(m\) 个数,与从 \(n\) 个数中选 \(n-m\) 个数的方案数相同,相当于剩下 \(n-m\) 个数不选。

式子2

\\\binom{n}{m}=\\binom{n - 1}{m - 1} + \\binom{n - 1}{m} \\

证明:由定义即可得。

它的组合意义是 从 \(n\) 个数中选 \(m\) 个数的方案数 = 已经考虑了前 \(n - 1\) 个数,选择当前数的方案数(\(\binom{n-1}{m-1}\)) + 不选当前数的方案数 (\(\binom{n-1}{m}\))

它满足杨辉三角(帕斯卡三角)。

它可以看做一个递推式。

式子3

\\\binom{n}{m}=\\frac{n}{m}\\binom{n-1}{m-1} \\

证明:由定义即可得。

式子4 二项式定理

\\\forall n\\in\\mathbb{N},(x+y)\^n = \\sum\\limits_{i=0}\^{n}\\binom{n}{i}x\^iy\^{n-i} \\

证明:

证法1:

数学归纳法。当 \(n = 0\) 时,\((x+y)^0=1=\sum\limits_{i=0}^{0}\binom{0}{i}x^iy^{0-i}\),成立。

当 \(n=m\) 成立,现在证明 \(n=m+1\) 时成立:

\\\begin{aligned} \& (x+y)\^{m+1} \\\\ \& =(x+y)(x+y)\^m \\\\ \& =(x+y)\\sum\\limits_{i=0}\^{m}\\binom{m}{i}x\^iy\^{m-i} \\\\ \& =\\sum\\limits_{i=0}\^{m}\\binom{m}{i}x\^{i+1}y\^{m-i} + \\sum\\limits_{i=0}\^{m}\\binom{m}{i}x\^iy\^{m+1-i} \\\\ \& =\\sum\\limits_{i=1}\^{m+1}\\binom{m}{i-1}x\^iy\^{m+1-i}+\\sum\\limits\^m_{i=0}\\binom{m}{i}x\^iy\^{m+1-i} \\\\ \& =\\binom{m}{m}x\^{m+1}y\^0+\\binom{m}{0}x\^0y\^{m+1} + \\sum\\limits_{i=1}\^{m}(\\binom{m}{i-1}+\\binom{m}{i})x\^iy\^{m+1-i} \\\\ \& =\\binom{m+1}{m+1}x\^{m+1}y\^0+\\binom{m+1}{0}x\^0y\^{m+1} + \\sum\\limits_{i=1}\^{m}\\binom{m+1}{i}x\^iy\^{m+1-i} \\\\ \& =\\sum\\limits_{i=0}\^{m+1}\\binom{m+1}{i}x\^iy\^{m+1-i} \\\\ \& =\\sum\\limits_{i=0}\^{n}\\binom{n}{i}x\^iy\^{n-i} \\end{aligned} \\

证毕。

由二项式定理可以得出许多有用的式子:

  • \(\sum\limits_{i=0}^{n}\binom{n}{i}=2^n\)

    证明:将 \((1+1)^n\) 二项式展开即得。

    它的组合意义是,从 \(n\) 个数中选若干个数的方案数 = 从 \(n\) 个数中选 \(0\) 个数的方案数 + 从 \(n\) 个数中选 \(1\) 个数的方案数 + ... + 从 \(n\) 个数中选 \(n\) 个数的方案数。

  • \(\sum\limits_{i=0}^{n}(-1)^i\binom{n}{i} = 0\)

    证明:将 \(((-1)+1)^n\) 二项式展开即得。

式子4

\\\sum\\limits_{i=0}\^{n}\\binom{m+i}{i} = \\binom{m+n+1}{m+1} \\

证明:

\ \\begin{aligned} \& \\sum\\limits_{i=0}\^{n}\\binom{m+i}{i} \\\\ \& =\\sum\\limits_{i=0}\^{n}\\binom{m+i}{m} \\\\ \& =\\binom{m}{m}+\\binom{m+1}{m}+\\binom{m+2}{m}+\\binom{m+3}{m}+\\dots+\\binom{m+n}{m} \\\\ \& =\\binom{m+1}{m+1}+\\binom{m+1}{m}+\\binom{m+2}{m}+\\binom{m+3}{m}+\\dots+\\binom{m+n}{m} \\\\ \& =\\binom{m+2}{m+1}+\\binom{m+2}{m}+\\binom{m+3}{m}+\\dots+\\binom{m+n}{m}\\\\ \& \\cdots \\\\ \& =\\binom{m+n+1}{m+1} \\end{aligned} \\

证毕。

不定方程整数解问题

问题1

\m\\geq n,求x_i\\geq1,x_1+x_2+x_3+\\cdots+x_n=m的正整数解方案数 \\

隔板法。

考虑有 \(m\) 个点,放入 \(n - 1\) 个隔板,将 \(m\) 个点分成 \(n\) 组点,每组点的个数为 \(x_i\) 的值。

例如:\(m=10,n=3\),有一种方案是:.|.......|..,这代表 \(x_1=1,x_2=7,x_3=2\)。

隔板显然不能放最左边和最右边,则 \(m\) 个点总共有 \(m-1\) 个空可供 \(n-1\) 个隔板放置,答案即为 \(\binom{m-1}{n-1}\)。

问题2

\给定n,m,a_i,求x_i\\geq a_i,x_1+x_2+x_3+\\cdots+x_n=m的正整数解方案数 \\

考虑转换成问题1。换元 \(y_i=x_i-a_i+1\),原问题转化为求 \(y_i\geq 1,y_1+y_2+y_3+\cdots+y_n=m+\sum(-a_i+1)\)的正整数解方案数,答案即为 \(\binom{m+\sum(-a_i+1)-1}{n-1}\)

问题3

\n\\geq m,求x_i\\geq 1,x_1+x_2+x_3+\\cdots+x_n\\leq m正整数解方案数 \\

新添一个数 \(x_{n+1},x_{n+1} = m - \sum\limits_{1\leq i\leq n} x_i\),\(x_i\) 没用完的都给 \(x_{n+1}\),原问题转化为求 \(x_i\geq 1,x_1+x_2+x_3+\cdots+x_n+x_{n+1}\leq m\) 的正整数方案数,答案即为 \(\binom{m - 1}{n}\)。

问题4

\l\\leq n\\leq r,求x_i\\geq 1,l\\leq x_1+x_2+x_3+\\cdots+x_n\\leq r正整数解方案数 \\

拆成两个问题:

  1. 求 \(x_i\geq 1,x_1+x_2+x_3+\cdots+x_n\leq l-1\) 正整数解方案数
  2. 求 \(x_i\geq 1,x_1+x_2+x_3+\cdots+x_n\leq r\) 正整数解方案数

2.的方案数 - 1.的方案数即为答案。

卡特兰数 Catalan

给定 \(n\) 个 \(0\) 和 \(n\) 个 \(1\),按某种顺序排成长度为 \(2n\) 的序列,满足任意前缀中 \(0\) 的个数都不少于 \(1\) 的个数的序列的数量为:

\Cat_n = \\frac{\\binom{2n}{n}}{n+1} \\

\Cat_n = \\sum\\limits_{i=1}\^n{Cat_{i-1} \\cdot Cat_{n-i+1}},Cat_0=1 \\

证明:\(Cat_n = \frac{\binom{2n}{n}}{n+1}\)

令 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 随意排列成一个长度为 \(2n\) 的序列 \(S\),若 \(S\) 不满足任意前缀中 \(0\) 的个数都不小于 \(1\) 的个数,则存在一个最小的位置 \(2p+1\in1,2n\cap\mathbb{Z}\),使得 \(S1\\sim 2p+1\) 中有 \(p\) 个 \(0\)、\(p+1\) 个 \(1\)。把 \(S2p+2\\sim2n\) 中所有数字取反后,包含 \(n-p-1\) 个 \(0\)、\(n-p\) 个 \(1\)。于是我们得到了由 \(n-1\) 个 \(0\) 和 \(n+1\) 个 \(1\) 排成的、存在一个前缀 \(0\) 比 \(1\) 多的序列。

同理。令 \(n-1\) 个 \(0\) 和 \(n+1\) 个 \(1\) 随意排列成一个长度为 \(2n\) 的序列 \(S\),存在一个最小的位置 \(2p+1\in1,2n\cap\mathbb{Z}\),使得 \(S1\\sim 2p+1\) 中有 \(p\) 个 \(0\)、\(p+1\) 个 \(1\)。把 \(S2p+2\\sim2n\) 中所有数字取反后,我们得到了由 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 排成的、存在一个前缀 \(0\) 比 \(1\) 多的序列。

因此,以下两种序列构成一个双射:

  1. 由 \(n\) 个 \(0\)、\(n\) 个 \(1\) 排成的、存在一个前缀 \(0\) 比 \(1\) 多的序列。
  2. 由 \(n-1\) 个 \(0\)、\(n+1\) 个 \(1\) 排成的序列。

后者显然有 \(\binom{2n}{n-1}\) 个。

综上,由 \(n\) 个 \(0\) 和 \(n\) 个 \(1\),按某种顺序排成长度为 \(2n\) 的序列,满足任意前缀中 \(0\) 的个数都不少于 \(1\) 的个数的序列的数量为:

\Cat_n = \\binom{2n}{n} - \\binom{2n}{n-1} = \\frac{\\binom{2n}{n}}{n+1} \\

证毕。(此证明摘自李煜东《算法竞赛进阶指南》)

证明:\(Cat_n = \sum\limits_{i=1}^n{Cat_{i-1} \cdot Cat_{n-i+1}},Cat_0=1\)

考虑序列 \(1,2,3,...,n\) 经过一个栈的合法出栈的方案数 \(f_n\)。

将进栈操作看做 \(0\), 出栈操作看做 \(1\),则 \(f_n = Cat_n\)。

对于当前数字 \(i\),\(1\sim i-1\) 有 \(f_{i-1}\) 进出栈方案,\(i+1\sim n\) 有 \(f_{n-i+1}\) 种进出栈方案,所以共有 \(f_{i-1}\cdot f_{n-i+1}\) 种方案。对于所有数字有 \(f_n=\sum\limits_{i=1}^n{f_{i-1}\cdot f_{n-i+1}}\) 种方案。

综上 \(Cat_n = \sum\limits_{i=1}^n{f_{i-1}\cdot f_{n-i+1}}\)。

证毕。

与卡特兰数有关的问题

\(n\) 个左括号和 \(n\) 个右括号组成的合法括号序列的数量为 \(Cat_n\)。

证明:将左括号看做 \(0\),将右括号看做 \(1\) 即得。


\(n\) 个节点构成不同的二叉树的数量为 \(Cat_n\)。

证明:设\(n\) 个节点构成不同的二叉树的数量为 \(f_n\),对于当前的节点 \(i\),\(1\sim i-1\) 节点放置的方案数为 \(f_{i-1}\),\(i+1\sim n\) 节点放置的方案数为 \(f_{n-i+1}\),则 \(f_n = \sum\limits_{i=1}^{n}{f_{i-1}\cdot f_{n-i+1}}\),符合 \(Cat_n\),的式子。


在平面直角坐标系中,从 \((0,0)\) 开始,每一步只能向上或向右走,走到 \((n, n)\) 并且除两个端点外不接触直线 \(y=x\) 的路线数量为 \(2Cat_{n-1}\)。

证明:

第一步只能向上或向右走,就变成了两个本质相同的问题,所以答案 \(\times2\)。

现在考虑第一步向右走,即从 \((1,0)\) 点开始。设走一步的操作为 U、R,U 代表向上,R 代表向右,最后走到 \((n,n)\) 点的操作一定形如 RRUURRU...,由 \(n-1\) 个 U 和 \(n-1\) 个 R 组成的串。为了不接触直线 \(y=x\),操作一定满足任意前缀 R 的数量大于等于 U 的数量。将 R 看做 \(0\),U 看做 \(1\),答案即为 \(Cat_{n-1}\)。

容斥原理

摩根定律

记 \(\overline{A}\) 为以 \(S\) 为全集 \(A\) 的补集。

\\\overline{A\\cap B} = \\overline{A} \\cup \\overline{B} \\\\ \\overline{A\\cup B} = \\overline{A} \\cap \\overline{B} \\

容斥原理

\\\left\|\\bigcup\\limits_{i=1}\^{n}{A_i}\\right\| = \\sum\\limits_{\\emptyset \\neq J\\subseteq\\{1,2,3,\\cdots,n\\}}{(-1)\^{\|J\|+1}\\bigcap_{i\\in J}\\left\|A_i\\right\|} \\

例如 \(|A\cup B| = |A| + |B| - |A\cap B|\),\(|A\cup B\cup C| = |A| + |B| + |C| - |A\cap B| - |A\cap C| - |B\cap C| + |A\cap B\cap C|\)

\\\left\|\\bigcap_{i=1}\^{n}\\overline{A_{i}}\\right\| = \|S\| -\\sum_{{\\emptyset\\neq J\\subseteq\\{1,...,n\\}}}(-1)\^{\|J\|+1}\\left\|\\bigcap_{j\\in J}A_{j}\\right\|=\\sum_{{J\\subseteq\\{1,...,n\\}}}(-1)\^{\|J\|}\\left\|\\bigcap_{j\\in J}A_{j}\\right\| \\

\\\left\|\\bigcap_{i=1}\^nA_i\\right\|= \|S\| -\\sum_{{\\emptyset\\neq J\\subseteq\\{1,...,n\\}}}(-1)\^{\|J\|+1}\\left\|\\bigcap_{j\\in J}\\overline{A_{j}}\\right\| =\\sum_{J\\subseteq\\{1,...,n\\}}(-1)\^{\|J\|}\\left\|\\bigcap_{j\\in J}\\overline{A_j}\\right\| \\

多重集组合数

特殊情况

设 \(S = \{n_1 \cdot a_1, n_2 \cdot a_2, \cdots, n_k \cdot a_k\}\) 是由 \(n_1\) 个 \(a_1\)、\(n_2\) 个 \(a_2\)、\(\cdots\)、\(n_k\) 个 \(a_k\) 组成的多重集。给定非负整数 \(r\),\(\forall i,r \leq n_i\)。从 \(S\) 中取出 \(r\) 个元素组成一个多重集(不考虑元素的顺序),可得的不同多重集的数量为:

\\\binom{k+r-1}{k-1} \\

证明:

考虑不定方程。

设选了 \(x_i\) 个 \(a_i\),则有方程 \(\sum\limits_{1\leq i\leq k}x_i =r,0 \leq x_i \leq n_i\),因为 \(r\leq n_i\),则一定满足 \(x_i \leq n_i\)。原问题变成 \(\sum\limits_{1\leq i\leq k}x_i =r,0 \leq x_i\) 的正整数解,这是不定方程整数解问题2,答案即为 \(\binom{k+r-1}{k-1}\),证毕。

一般情况

设 \(S = \{n_1 \cdot a_1, n_2 \cdot a_2, \cdots, n_k \cdot a_k\}\) 是由 \(n_1\) 个 \(a_1\)、\(n_2\) 个 \(a_2\)、\(\cdots\)、\(n_k\) 个 \(a_k\) 组成的多重集。给定非负整数 \(r\)。从 \(S\) 中取出 \(r\) 个元素组成一个多重集(不考虑元素的顺序),可得的不同多重集的数量为:

\\\binom{k-1}{k+r-1} - \\sum\\limits_{1\\leq i\\leq k}\\binom{k+r-n_i-2}{k-1} + \\sum\\limits_{1\\leq i\< j\\leq k}\\binom{k+r-n_i-n_j-3}{k-1}- \\cdots + (-1)\^k\\binom{k+r-\\sum_{i=1}\^{k}n_i - (k + 1)}{k-1} \\

\\\binom{k-1}{k+r-1} - \\sum\\limits_{\\emptyset\\neq S\\subseteq\\{1,2,3,\\dots,k\\}}{(-1)\^{\|S\|+1}\\binom{k+r-\\sum\\limits_{i\\in S}{n_i}- \|S\| -1}{k-1}} \\

证明:

考虑不定方程。

设选了 \(x_i\) 个 \(a_i\),则有方程 \(\sum\limits_{1\leq i\leq k}x_i =r,0 \leq x_i \leq n_i\)。

先不考虑 \(x_i \leq n_i\) 的限制,\(0\leq x_i\) 的方案数为 \(\binom{k-1}{k+r-1}\),然后再减去不合法的方案。

不合法的方案为 \(\exists x_i,x_i\geq n_i\)的方案。于求不合法的方案:

设 \(x_a \geq n_a\),则限制变为 \(x_a \geq n_a, 0\leq x_i, (i\neq a)\),这是不定方程整数解问题2,答案即为 \(\binom{k+r-n_a-2}{k - 1}\)。

设 \(a\neq b,x_a \geq n_a, x_b \geq n_b\),则限制变为 \(x_a \geq n_a,x_b\geq n_b, 0\leq x_i, (i\neq a,i\neq b)\),这是不定方程整数解问题2,答案即为 \(\binom{k+r-n_a-n_b-3}{k - 1}\)。上一种包含含这种情况,所以要减去。

以此容斥。

最中得到 \(\binom{k-1}{k+r-1} - \sum\limits_{\emptyset\neq S\subseteq\{1,2,3,\dots,k\}}{(-1)^{|S|+1}\binom{k+r-\sum\limits_{i\in S}{n_i}- |S| -1}{k-1}}\)。

证毕。

相关推荐
_wyt00110 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾13 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you15 小时前
constexpr函数
c++
凡人叶枫15 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫15 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss15 小时前
BRpc使用
c++·rpc
-森屿安年-16 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream16 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶
森G16 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
碧海蓝天202216 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++