• 二项式反演入门


    前言

    符号约定:

    • \(C_n^m\)表示在\(n\)个元素中选择\(m\)个,而不是在\(m\)个元素中选择\(n\)个。

    简介

    一个二项式反演就是一个简单的推导。

    \[若有f(n)=\sum_{i=0}^n C_n^i g(i)\\ 则有g(n)=\sum_{i=0}^n (-1)^{n-i} C_n^i f(i) \]

    来一个简单的证明吧:

    \[\begin{aligned} 右式 & = \sum\limits_{i=0}^n (-1)^{n-i} C_n^i f(i)\\ & = \sum\limits_{i=0}^n (-1)^{n-i} C_n^i \sum\limits_{j=0}^i C_i^j g(j)\\ & = \sum\limits_{i=0}^n \sum\limits_{j=0}^i (-1)^{n-i} C_n^i C_i^j g(j)\\ & = \sum\limits_{j=0}^n \sum\limits_{i=j}^n (-1)^{n-i} C_n^i C_i^j g(j) \end{aligned} \]

    因为组合数的性质:

    \[C_i^j \times C_j^k=C_i^k \times C_{i-k}^{j-k} \]

    \[\begin{aligned} 右式 & = \sum\limits_{j=0}^n \sum\limits_{i=j}^n (-1)^{n-i} C_n^j C_{n-j}^{i-j} g(j)\\ & = \sum\limits_{j=0}^n \sum\limits_{i=0}^{n-j} (-1)^{n-i-j} C_n^j C_{n-j}^i g(j)\\ \end{aligned} \]

    可以发现,存在

    \[\sum\limits_{i=0}^{n-j} (-1)^{n-i-j} C_{n-j}^i=(1-1)^{n-j} \]

    那么

    \[\begin{aligned} 右式 & = \sum\limits_{j=0}^n (1-1)^{n-j} g(j) \end{aligned} \]

    因为当\(n-j \neq 0\)的时候,是右边绝对是\(0\),因此只有\(n=j\)的时候有贡献,又因为存在:

    \[\sum\limits_{i=0}^n (-1)^{n-i} C_n^i=1 \]

    因此

    \[右式=g(n)=左式 \]

    (突然发现这证明还是很长的)

    例题

    LUOGU-P5505 [JSOI2011]分特产

    题意就不说了,数据范围也不说了。

    首先可以发现,恰好全部人都能分到特产是非常难算的。那么就转化问题。

    首先设两个函数

    \[\begin{aligned} & f(i)表示恰好有i个人没有得到特产,其余人得到特产\\ & g(i)表示钦定了i个人没有得到特产,其他人随意 \end{aligned} \]

    那么可以得到:

    \[g(i)=\sum\limits_{j=i}^n C_i^j f(j)\Longleftrightarrow f(i)=\sum\limits_{j=i}^n (-1)^{j-i}C_i^jg(j) \]

    而最终的答案显然是\(f(0)\)

    接下来就是求出\(g(i)\),因为已经钦定了\(i\)个人,那么剩下人只需要用插板法随意分配就好了。

    \[g(i)=\prod\limits_{j=0}^m C_{a_j+i-1}^{i-1} \]

    可以发现,二项式定理可以用于解决一些有"恰好\(k\)个","刚好\(k\)个"的计数问题。将"恰好"转化为"钦定",通常可以是问题更简单。

    LUOGU-P4859 已经没有什么好害怕的了

    题意就不说了,数据范围也不说了。

    首先,转化一下题目说法,可以发现,药片比糖果能量大的组有\(m=\frac{n+k}{2}\)个。

    接着继续设两个函数:

    \[\begin{aligned} f(i)& 表示恰好m组是药片比糖果能量大的,剩余是药片比糖果能量大的。\\ g(i)& 表示钦定m组是药片比糖果能量大的,剩余随意 \end{aligned} \]

    可以发现:

    \[g(i)=\sum\limits_{j=i}^n C_i^j f(j)\Longleftrightarrow f(i)=\sum\limits_{j=i}^n (-1)^{j-i}C_i^jg(j) \]

    答案显然为\(f(k)\)。接下来求解\(g(i)\)

    \(lim_i\)表示比\(a_i\)小的\(b_j\)个数,那么可以得到:

    \[f(i,j)=f(i-1, j) + f(i-1, j-1) * \left[r_i - (j - 1)\right] \]

    \(g(i)\)显然就是\(f(n,i)\times (n-i)!\)

  • 相关阅读:
    python -第七节课之redis操作
    python 实战之商品管理数据库操作
    python 操作extel实战之写一个函数,传入一个表名,导出到excel中
    python -第六节课-异常处理和发送邮件的方法
    python -argv方法讲解
    python -第五节-python导入模块的顺序结构 和if __name__的讲解 包含两个练习
    python -第四节函数
    pycharm的设置
    第二节python基础
    第一节python基础
  • 原文地址:https://www.cnblogs.com/juruohjr/p/15699607.html
Copyright © 2020-2023  润新知