首页 > 其他分享 >带标号弱连通DAG计数

带标号弱连通DAG计数

时间:2023-02-23 15:02:28浏览次数:68  
标签:标号 DAG frac sum 计数 binom aligned

带标号弱连通DAG计数

前言:

前段时间做到了一个无向图边定向的题,就一直没搞懂其中的容斥,今天终于弄懂了。


题意:对弱连通带标号的简单 DAG 计数,\(n\leq10^5\)。

“弱连通”这个限制可以表示为“集和”,任意 DAG 可以视作“集族”,所以二者的 EGF 满足关系 \(\operatorname{Exp}(g(x))=f(x)\),求出任意 DAG 计数再做 \(\operatorname{ln}\) 即可,现在考虑如何求出任意 DAG 计数。

考虑 \(dp\),令 \(f_x\) 表示 \(x\) 个点的 \(DAG\) 的数量。

考虑将 DAG 分层,然后按照拓扑序加点,新加入的一些点没有后继,并且让原本的点向这些点连边。

但是考虑到原本的某些点也没有后继,即分层后相邻的若干层其实可以合并成一层,所以考虑容斥。

令钦定 \(i\) 个点这层的点的方案数为 \(s_i\),恰好 \(i\) 个点的方案数为 \(t_i\),则有 \(s_i=\sum _{j\geq i} \binom{j}{i}t_j\)。

有二项式反演

\[t_i=\sum _{j\geq i} \binom{j}{i}(-1)^{j-i}s_j \]

其中

\[s_i=\binom{n}{i}\times2^{i(n-i)}\times f_{n-i} \]

我们写出原本的式子:

\[\begin{aligned} f_i &=\sum_{j=1}^i t_j\\ &=\sum _{j=1}^i \sum_{k\geq j} \binom{k}{j}(-1)^{k-j}\binom{i}{k}2^{i(i-k)} f_{i-k} \end{aligned} \]

因为转移来的项和 \(k\) 相关所以把求和换位,和 \(k\) 相关的放到前面:

\[\begin{aligned} f_i &=\sum_{k=1} ^i \binom{i}{k}2^{i(i-k)} f_{i-k} \sum _{j=1}^k \binom{k}{j}(-1)^{k-j} \end{aligned} \]

把后面那坨补上一个 \((-1)^k\) 即可使用二项式定理得到 \(0\),所以

\[f_i=\sum_{k=1}^i\binom{i}{k} 2^{i(i-k)} f_{i-k} \times(-1)^{k+1} \]

感性地理解可以将含 \(i\) 个点层看作拥有 \(i\) 个属性的容斥。

这个东西显然可以分治 NTT ,把 \(2\) 的指数拆成二次剩余或者组合数只差就可以做到。

考虑优化,将这个式子变形一下,可以得到:

\[\frac {f_i}{i!2^{\binom{i}{2}}}=\sum_{k=1}^i \frac { f_{i-k} }{2^\binom{i-k} {2}} \times \frac {(-1)^{k+1}}{2^{\binom k 2}} \]

所以将 \(\frac {f_i}{i!2^{\binom{i}{2}}}\) 看作有序集族数,\(\frac {(-1)^{k+1}}{2^{\binom k 2}}\) 看作集合数,多项式求逆即可做到 \(O(n\log n)\)。

标签:标号,DAG,frac,sum,计数,binom,aligned
From: https://www.cnblogs.com/Dreamerkk/p/17147952.html

相关文章

  • 一文理解JVM的程序计数器(PC)
    目录1功能演示2跳转、循环等执行的执行原理3关于PC的面试题JVM中的程序计数寄存器(ProgramCounterRegister)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的......
  • 野火FreeRTOS计数信号量实验意外处理
    编译的时候,一直说xSemaphoreCreateCounting这个函数没有定义。最后发现,是FreeRTOSConfig.h文件中,没有将使能计数信号量的宏打开。解决办法:在FreeRTOSConfig.h中 ......
  • 【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)
    树的计数II题目链接:YBT2023寒假Day12C题目大意给你一个长度为n的排列p,问你有多少个不同的有标号无根树,满足如果i,j有边那pi,pj也有边。思路首先可以把排列变......
  • 带标号二分图计数
    本文中\(f[i]\)表示\([x^i]f(x)\)带标号的二分图的数量不方便用一个式子直接写出,我们考虑用别的统计去推出它。我们先求出连通二分图的生成函数,再求任意二分图的生成......
  • P2602 [ZJOI2010] 数字计数:数位DP
    https://www.luogu.com.cn/problem/P2602//#include<iostream>//#include<iomanip>//#include<unistd.h>//#include<climits>//#include<string>//#inclu......
  • [51Nod 1222] - 最小公倍数计数 (..怎么说 枚举题?)
    题面题目分析令则此处表示小于等于中,满足两个数互质且乘积为的无序数对的个数,显然其中表示d的质因子个数相当于把d的质因数分成两部分,所以就每个质因数选或不选,又因为......
  • 内存计数基础原理
    有new、alloc、copy(计数器加一),就得release(计数器减一)////Person.h//a1////Createdbymahongminon14-4-21.//Copyright(c)2014年mahongmin.Allright......
  • DAG的深度优先搜索标记
    对于在图G上进行深度优先搜索算法所产生的深度优先森林Gt,我们可以定义四种边的类型:1.树边(TreeEdge):为深度优先森林中Gt的边。如果结点v是因算法对边(u,v)的搜索而首先被发......
  • 字符分割并计数
    从文件中读取一行字符,对字符按逗号分割成单词,并计算每个单词出现次数#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructword{charstr[32......
  • 多线程计数 AtomicInteger
    大家在工作中肯定遇到过计数统计需求,单线程的情况下count直接定义int型就行,可是在多线程并发下会产生多个线程同时count++的情况,那么这种情况就需要用到AtomicInteger来保......