我一生之敌是状压

本文发表于

题面

给一个 \(n\) 点 \(m\) 边无向图 \(G=(V,E)\) 和一棵树,问有多少个排列 \(\{a_i\}\) 使得对于树上每一条边 \((u,v)\) 都有 \((a_u, a_v)\in E\) .

\(n\le 17\),\(m\le \dfrac 12n(n-1)\) .

题解

前置知识 - 子集反演

首先反演是啥大家都知道吧

正着的子集反演:

\[\boxed{f(S)=\sum_{T\subseteq S}g(T)\quad \Longleftrightarrow\quad g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)}
\]

证明(抄的 vfleaking 神仙的):

Lemma.

\[\sum_{T\subseteq S}(-1)^{|T|}=|S=\varnothing|
\]

和二项式反演形式相似吧


好,回到原命题 .

\[\large\begin{aligned}g(S)&=\sum_{T\subseteq S} [S-T=\varnothing]g(T)\\&=\sum_{T\subseteq S}\sum_{R\subseteq S-T}(-1)^{|R|}g(T)\\&=\sum_{T\subseteq S}(-1)^{|T|}\sum_{R\subseteq S-T}g(R)\\&=\sum_{T\subseteq S}(-1)^{|T|}f(T-S)\\&=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)\end{aligned}
\]

和原式长得一模一样,证毕 .


似乎 vfk 的课件里 \(p,q\) 是二进制表示的集合吧,希望我没理解错QwQ

vfk 课件偷偷在第三步换了一下变量名,坏坏

(反向子集反演:

\[f(S)=\sum_{S\subseteq T}g(T)\quad \Longleftrightarrow\quad g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}f(T)
\]

可以看做正着反演的直接推论)

别的不说了,这里又不是「子集反演学习笔记」.

1. 朴素 dp

考虑状压 dp.

令 \(dp_{i, j, S}\) 表示 \(i\) 点表示 \(j\),已经表示了 \(S\) 状态的方案数 .

\(i,j\) 维度显然,\(S\) 是为了去重,因为 \(a\) 必须是排列 .

转移非常容易:

\[\large dp_{i, j, S}=\prod_{v\in\operatorname{son}(i)}\sum_{q\subseteq S, (j,p)\in E}dp_{v, p, q}
\]

会点计数原理(加法,乘法)就能推出来 .

时间复杂度 \(O(n^33^n)\) .

定睛一看:\(n\le 17\),寄!

2. 优化一下

看看状态,这个 \(S\) 看起来挺没用,于是直接丢掉!

没了 \(S\) 我们就不能去重了呐,所以 \(a\) 是排列这个东西就不太能保证了 .

在 \(a\) 不一定是排列的前提下,定义:

  • \(f(S)\):\(a\) 恰好使用了 \(S\) 中的所有点的方案数
  • \(g(S)\):\(a\) 至多使用了 \(S\) 中的所有点的方案数

我们要的答案就是 \(f(U)\)(\(U\) 是全集)

显然有

\[g(S)=\sum_{T\subseteq S}f(S)
\]

妈呀这不是子集反演吗,于是

\[f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T)
\]

于是我们只要求 \(g\) 即可!

\(g\) 咋求呐?考虑 dp,令 \(dp_{i, j}\) 表示 \(i\) 点表示 \(j\),在 \(g\) 的条件下的方案数 .

于是可以轻易转移(与朴素的类似)

\[\large dp_{i, j}=\prod_{v\in\operatorname{son}(i)}\sum_{p\in S, (j,p)\in E}dp_{v, p}
\]

我草这不是和朴素的一模一样吗

于是

\[\large g(S)=\sum_{k\in S}dp_{root, k}
\]

\(root\) 是树的根,你随便钦定一个就好了 .

单次 dp \(O(n^22^n)\),总时间复杂度 \(O(n^32^n)\),大体能过

细节

答案不大于 \(n!\le 355687428096000\),long long 完全能行 .

然而 \(g(S)\le n^n\le 827240261886336764177\),unsigned long long 都不行 .

我们自然可以用 __int128,但是,其实我们随便选一个幸运数字 \(M>n!\),然后答案对 \(M\) 取模就行了!

方便点,unsigned long long 自然溢出就完啦!是不是很简单

有符号整形溢出是 UB,但是我懒的改了,我代码里是有符号的 .

代码

提交记录 https://uoj.ac/submission/528128 .

吸个氧跑得飞快,不吸就会 TLE(或许是用 vector 太多了?)

自以为可读性好!

Ref.

ZJOI2016 小星星 题解的更多相关文章

  1. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥

    P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...

  2. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

  3. 4455[Zjoi2016]小星星 容斥+dp

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 527  Solved: 317[Submit][Status] ...

  4. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

  5. 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 426  Solved: 255 Description 小Y是 ...

  6. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  7. bzoj 4455 [Zjoi2016]小星星 树形dp&容斥

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 643  Solved: 391[Submit][Status] ...

  8. 【题解】Luogu P3349 [ZJOI2016]小星星

    原题传送门 我们考虑设\(dp_{i,j}\)表示树上的点\(i\)在图上对应的点为\(j\)时\(i\)和子树对应在图上的方案数 \(dp_{u_i}=\prod_{v \in u.son} dp_ ...

  9. [ZJOI2016]小星星

    题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. 有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了 ...

随机推荐

  1. AC自动机:Tire树+KMP

    简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合K ...

  2. Linux磁盘空间查看及空间满的处理

    问题 在部署应用到测试环境的时候,有些文件同步出错,最后定位到测试服务器空间满了. 解决 查看磁盘空间还剩多少空间 df -h 查看根目录下每个目录占用空间大小 du --max-depth=1 -h ...

  3. 「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  4. linux篇-新建svn仓库

    1昨天需要在服务器上新建一个仓库,解决方法是把已有的仓库拷贝出来,库删除在放进去 2然后今天想看看有没有命令的方法 find / -name project 首先查看一下项目的位置 3创建仓库 svn ...

  5. ethtools-网卡适配器管理

    查看网卡适配器配置信息,并且我们可以通过它修改网卡适配器的双工模式. 1.安装Ethtools [root@localhost ~]# yum -y install ethtools 2.命令语法 语 ...

  6. 「文化课 · 校园生活」街舞社演出 & 校园十佳歌手决赛

    女孩子跳舞很好看(流鼻血),男孩子跳舞很骚,跳的很有感觉.

  7. React简单教程-4-事件和hook

    前言 在上一章 React 简单教程-3-样式 中我们建立了一个子组件,并稍微美化了一下.在另一篇文章 React 简单教程-3.1-样式之使用 tailwindcss 章我们使用了 tailwind ...

  8. 解决Docker运行命令时提示"Got permission denied while trying to connect to the Docker daemon socket"类情况

    Docker安装命令: 解决Docker运行命令时提示"Got permission denied while trying to connect to the Docker daemon ...

  9. 我的第一个springboot starter

      在springboot中有很多starter,很多是官方开发的,也有是个人或开源组织开发的.这些starter是用来做什么的呐? 一.认识starter   所谓的starter,在springb ...

  10. 6大优势、2种类型,一文吃透动态应用安全测试(DAST)

    在在上篇文章中中,我们了解了 SAST 的概念.优劣和使用的工具,并在文章里提到了另一个软件安全领域里的重要技术 DAST.本文将会详细介绍 DAST 的概念.重要性及其工作原理.   DAST(Dy ...