zoukankan      html  css  js  c++  java
  • 【多项式·应用篇】有标号DAG计数问题

    (Preface)

    本文的核心内容很简单,就是围绕(n)个点的有标号(DAG)个数展开的一系列讨论。

    (Problem) (1)-(1)

    • (n)个点的有标号(DAG)个数。
    • 可以不连通。
    • (nle5000)

    看数据范围显然只要用(O(n^2))的做法就可以了。

    考虑(DAG)中必然存在入度为(0)的点,且去掉这些入度为(0)的点之后得到的依然是(DAG)

    于是,我们可以设(f_i)表示(i)个点的有标号(DAG)数目,枚举一个(j)表示至少存在(j)个入度为(0)的点。

    显然有此时的方案数为:

    [C_i^j imes 2^{j imes (i-j)} imes f_{i-j} ]

    即,枚举选出哪(j)个点,枚举入度为(0)的点和其他点之间的边是否选择,而其他点依然形成(DAG)可以直接从已有状态转移。

    看到至少,我们可以考虑容斥

    因此得到最终的转移方程:

    [f_i=sum_{j=1}^i(-1)^{j-1} imes C_i^j imes2^{j imes(i-j)} imes f_{i-j} ]

    (Problem) (1)-(2)

    • (n)个点的有标号(DAG)个数。
    • 可以不连通。
    • (nle10^5)

    进一步考虑上面得到的式子,发现(2^{j imes(i-j)})这个东西很难处理。

    这需要一个据说算是套路的转化:

    [j imes(i-j)=frac{i^2}2-frac{j^2}2-frac{(i-j)^2}2 ]

    也就是说,原式就相当于:

    [f_i=sum_{j=1}^ifrac{i!}{j!(i-j!)} imesfrac{sqrt2^{i^2}}{sqrt2^{j^2}sqrt2^{(i-j)^2}} imes (-1)^{j-1} imes f_{i-j} ]

    即:

    [frac{f_i}{i! imessqrt 2^{i^2}}=sum_{j=1}^ifrac{(-1)^{j-1}}{j! imessqrt2^{j^2}} imesfrac{f_{i-j}}{(i-j)! imessqrt2^{(i-j)^2}} ]

    (F(x)=sum_{i=0}^nfrac{f_i}{i! imessqrt2^{i^2}}x^i,G(x)=sum_{i=1}^nfrac{(-1)^{i-1}}{i! imessqrt2^{i^2}}x^i),便有:

    [F(x)=G(x)*F(x)+1 ]

    稍微转化一下就能得到:

    [F(x)=frac1{1-G(x)} ]

    (Problem) (2)-(1)

    • (n)个点的有标号(DAG)个数。
    • 要求弱连通。
    • (nle5000)

    首先我们依然要求出(f_i)

    然后我们再设一个(g_i),转移时去枚举(1)号点所在弱连通块大小,可得:

    [g_i=f_i-sum_{j=1}^{i-1}C_{i-1}^{j-1}g_jf_{i-j} ]

    (Problem) (2)-(2)

    • (n)个点的有标号(DAG)个数。
    • 要求弱连通。
    • (nle10^5)

    发现(g_i=C_{i-1}^{i-1}g_if_{i-i}),恰好能和(sum)这一项拼在一起,也就是:

    [f_i=sum_{j=1}^iC_{i-1}^{j-1}g_jf_{i-j} ]

    拆开组合数得到:

    [frac{f_i}{(i-1)!}=sum_{j=1}^{i}frac{g_j}{(j-1)!} imesfrac{f_{i-j}}{(i-j)!} ]

    (F(x)=sum_{i=0}^nfrac{f_i}{(i-1)!}x^i,G(x)=sum_{i=0}^nfrac{g_i}{(i-1)!}x^i,H(x)=sum_{i=0}^nfrac{f_i}{i!}x^i),便有:

    [F(x)=G(x)*H(x) ]

    因此:

    [G(x)=F^{-1}(x)*H(x) ]

    (Postscript)

    好吧,余对于多项式这类问题终究还是不够熟练,仍需加强练习,唔姆。

  • 相关阅读:
    C语言运算符优先级和口诀
    跨域问题的解决方案 php
    浅谈跨域攻击及预防
    浅析Websocket--PHP
    linux下的删除目录和文件的方法
    python魔法方法
    双指针
    python常用模块
    python三大器
    对闭包的误区
  • 原文地址:https://www.cnblogs.com/Nero-Claudius/p/Poly1.html
Copyright © 2011-2022 走看看