bzoj #2863. 愤怒的元首

bzoj #2863

  • dpi 表示 i 个点的 DAG 个数。发现一个 DAG 删去出度为 0 的点后显然还是一个 DAG ,因此不妨枚举出度为 0 的点的个数: dpi=j=1idpij(ij)2j(ij)
  • 这么干显然不太对,因为我们不能保证每次删除时都能把图中的所有出度为 0 的点删完,换言之,我们后面这个式子求的是至少有 j 个出度为 0 的点的方案数,而我们想要求恰好,显然容斥原理
  • 我们设 fj 表示恰好有 j 个出度为 0 的点方案数, gi 表示至少有 j 个出度为 0 的点方案数,根据广义容斥,可以知道:

gi=j=in(ji)fjfi=j=in(1)ji(ji)gj

  • dpi=j=1ifi ,因此:

(1)dpi=j=1ifj(2)=j=1ik=ji(1)kj(kj)gk(3)=j=1ik=ji(1)kj(kj)dpik(ik)2k(ik)(4)=k=1ij=1k(1)kj(kj)dpik(ik)2k(ik)(5)=k=1i(ik)2k(ik)dpikj=1k(1)kj(kj)(6)=k=1i(ik)2k(ik)dpik(0(1)j)(7)=k=1i(1)j+1(ik)2k(ik)dpik

  • 还有一种理解思路:根据容斥原理, |i=1nAi|=i=1n(1)i+1S|xSAx| ,因此直接容斥就可以
  • 最终复杂度 O(n)
posted @   FOX_konata  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示