(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)
好吧,余对于多项式这类问题终究还是不够熟练,仍需加强练习,唔姆。