zoukankan      html  css  js  c++  java
  • 「总结」容斥。二.反演原理 2.组合容斥

    2.二项式反演。

    运用最频繁的反演之一。形式很多。

    这里写一下最常用的两种形式:

    至多形式:

    $$g(m)=sumlimits_{i=0}^{m}inom{m}{i}f(i)$$

    $$f(m)=sumlimits_{i=0}^{m}(-1)^{m-i}inom{m}{i}g(i)$$

    至少形式:

    $$g(m)=sumlimits_{i=m}^{n}inom{i}{m}f(i)$$

    $$f(m)=sumlimits_{i=m}^{n}(-1)^{i-m}inom{i}{m}g(i)$$

    证明:

    只证明至多形式。

    $$f(m)=sumlimits_{i=0}^{m}(-1)^{m-i}inom{m}{i}g(i)$$

    $$=sumlimits_{i=0}^{m}sumlimits_{j=0}^{i}(-1)^{m-i}inom{m}{i}inom{i}{j}f(j)$$

    $$=sumlimits_{i=0}^{m}sumlimits_{j=0}^{i}(-1)^{m-i}inom{m-j}{i-j}inom{m}{j}f(j)$$

    改变枚举顺序。

    $$=sumlimits_{j=0}^{m}inom{m}{j}f(j)sumlimits_{i=j}^{m}(-1)^{m-i}inom{m-j}{i-j}$$

    后面的部分是$m-j$行二项式系数的奇偶错减,只有$j=m$的时候为1,其余为0。

    $$=sumlimits_{j=0}^{m}inom{m}{j}f(j)[j=m]$$

    $$=f(m)$$

    证毕。

    题目。

    $fr.$放棋子。

    这个题看起来很像二项式反演。

    发现每个颜色的棋子必然要占据他所在的行和列。

    设$g[i][j][k]$为第$i$种颜色的棋子占据$j$行$k$列的方案数。

    $f[i][j][k]$为前$i$种颜色占了$j$行$k$列的方案数。

    如果我们的到了$g$,就可以做二维背包求出$f$.

    现在问题转化为求$g$

    设至少有$l$行$r$列有棋子的方案为$h(l,r)$,恰好有这么多被占的为$p(l,r)$

    那么

    $$h(n,m)=sumlimits_{i=n}^{mxn}sumlimits_{j=m}^{mxm}inom{i}{n}inom{j}{m} p(i,j)$$

    $$p(n,m)=sumlimits_{i=n}^{mxn}sumlimits_{j=m}^{mxm}(-1)^{i+j}inom{i}{n}inom{j}{m}h(i,j)$$

    我们发现要求的$g[j][k]=p(j,k)$

    这样看起来仍然不是很好算因为我们很难求出$h(i,j)$于是考虑舍弃二项式反演。

    没错正解不是二项式反演。

    而我拿出这道题的原因就是我考场上推了很久的二项式反演。

    这也提醒我:用二项式反演之前要注意是否有一个已知函数是极便于求出的,如果不是,那么反演即使本身正确,也难以在正确的复杂度内求解。

    正解是补集容斥。

    $$g[n][m]=inom{nm}{num}-sumlimits_{i=0}^{n}sumlimits_{j=0}^{m}inom{n}{i}inom{m}{j}g[i][j]$$

    $se.$染色

    这个是真的二项式反演。

    设$f(k)$为恰好出现$S$次的颜色有$k$个的方案数,$g(k)为至少$。

    那么:

    $$g(k)=inom{m}{k}inom{n}{kS}frac{(kS)!}{(S!)^k}(m-k)^{n-kS}$$

    $$g(k)=sumlimits_{i=k}^{m}inom{i}{k}f(i)$$

    二项式反演得到

    $$f(k)=sumlimits_{i=k}^{m}(-1)^{i-k}inom{i}{k}g(i)$$

    再继续推一推就会发现是卷积的形式,这个时候我们$FFT$一发就可以在$O(mlogm)$时间内求出没一个$f(k)$的取值,乘权累加即可。

  • 相关阅读:
    Swing 顶层容器
    创建第一个界面程序
    SWING
    通俗解释高中生能听懂的SVM本质和原理
    [初学者入门]任何机器学习套路?逻辑回归是什么?要有哪些未知参数待求解?如何优化?梯度下降是什么?如何用梯度下降
    贝叶斯公式在机器学习中有什么用,实例讲解Python实现朴素贝叶斯分类器
    通俗易懂适合初学者的机器学习实战(1):k- Nearest Neighbor (k个最近的邻居)KNN算法
    Python从0开始实现Numpy矩阵库,拒绝掉包侠,学习造轮子
    99%的人都会忽略的Python易错点总结
    遇到问题,有哪些有效的分析方法?
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/11644603.html
Copyright © 2011-2022 走看看