当前位置: 首页 > news >正文

[ZJOI2016] 小星星

好题。

首先一个显然的 DP 是 \(dp_{u, i, S}\) 表示 \(u\) 映射到 \(i\)\(u\) 子树双射到 \(S\) 集合中的点的方案数,转移是 \(\mathcal{O}(n^3 3^n)\) 的,似乎精细实现常数很小可过。

考虑这个东西瓶颈在哪里,就是这个 \(s\),要是不要求映射是一个双射,即我们设 \(f_s\) 为树上所有点到 \(s\) 中点的映射是一个满射的方案数,\(g_s\) 为树上所有点和 \(s\) 的映射的方案数,即 \(f_s\) 要求每个 \(s\) 中的点被映射了至少一次,\(g_s\) 则要求每个 \(s\) 中的点被映射了任意次。显然有子集反演的转移:

\[g_S = \sum\limits_{T \subseteq S} f_T \]

\[f_S = \sum\limits_{T \subseteq S} (-1)^{|S| - |T|} g_T \]

最后求的显然是 \(f_{2^n - 1}\),而 \(g_s\) 还有一种转移,我们将 \(dp_{u, i, S}\) 设为 \(u\) 映射到 \(i\)\(u\) 子树到 \(S\) 中的点的映射的方案数。\(g_S = \sum_{i \in S} dp_{0, i, S}\),原因显然。所以最后不需要算其它 \(f_S\),只要算 \(f_{2^n-1}\) 即可。
时间复杂度 \(\mathcal{O}(n^3 2^n)\)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128 i128;
typedef pair<int, int> pii;
const int N = 17, mod = 998244353;
template<typename T>
void dbg(const T &t) { cout << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {cout << arg << ' ';dbg(args...);
}
namespace Loop1st {
int n, m, s, tot, a[N], b[N][N];
ll dp[N][N], ans;
basic_string<int>e[N];
void dfs(int u, int fa) {for (int i = 0; i < tot; i++) dp[u][i] = 1;for (int v : e[u]) if (v != fa) {dfs(v, u);for (int i = 0; i < tot; i++) {ll tmp = 0;for (int j = 0; j < tot; j++) if (b[a[i]][a[j]]) tmp += dp[v][j];dp[u][i] *= tmp;}}
}
void main() {cin >> n >> m;for (int i = 1, u, v; i <= m; i++) {cin >> u >> v; u--; v--;b[u][v] = b[v][u] = 1;}for (int i = 1, u, v; i < n; i++) {cin >> u >> v; u--; v--;e[u] += v; e[v] += u;}for (; s < (1 << n); s++) {tot = 0;for (int i = 0; i < n; i++) if (s >> i & 1) a[tot++] = i;dfs(0, 0);ll g = 0;for (int i = 0; i < tot; i++) g += dp[0][i];ans += ((n - tot) & 1) ? -g : g;}cout << ans << '\n';
}}
int main() {// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int T = 1;// cin >> T;while (T--) Loop1st::main();return 0;
}
http://www.zskr.cn/news/185570.html

相关文章:

  • 3步快速搞定论文排版:南京大学LaTeX模板终极指南
  • Miniconda-Python3.11镜像支持国产化操作系统统信UOS
  • WeChatBot_WXAUTO_SE:打造智能拟人化微信聊天机器人的完整指南
  • 10分钟快速掌握Vue智能数据表格组件
  • Widevine L3 DRM 绕过工具使用指南
  • 从网页到设计稿:html2sketch 高效转换指南
  • Markdown撰写技术博客|Miniconda-Python3.11镜像记录PyTorch实验过程
  • 如何快速解决GitHub访问难题:一站式Hosts同步方案
  • 10分钟搭建个人阅读平台:免费小说API终极指南
  • Nucleus Co-op:单机游戏分屏技术深度解析与实战指南
  • 如何快速掌握DownKyi:面向新手的B站音频提取完整操作手册
  • CAJ转PDF全攻略:开源工具助您实现学术文献便捷访问
  • PotPlayer终极Twitch扩展:告别第三方工具,原生观看高清直播
  • NNG轻量级消息库:从零开始构建高效分布式系统的终极指南
  • 夸克H5:零基础打造专业级H5页面的终极解决方案
  • knowledge-grab:高效解决教育资源下载难题的专业工具
  • 使用Miniconda-Python3.11部署代码生成大模型Codex克隆
  • GitHub项目本地运行指南:用Miniconda-Python3.11镜像快速配置PyTorch
  • GIMP现代化界面改造终极指南:免费打造专业级图像编辑体验
  • Nucleus Co-op分屏游戏配置完全攻略
  • 用lvgl界面编辑器打造智能灯光界面:操作指南
  • UniRig技术深度解析:AI如何重塑3D动画骨骼绑定流程
  • .NET Core企业级后台管理系统架构解密:YiShaAdmin的技术演进与实战洞察
  • WinDbg下载后的首次调试:快速理解基本流程
  • Jupyter Lab插件安装指南|Miniconda-Python3.11扩展功能增强
  • 如何借助国产化动环系统实现工厂环境监控智能化?
  • Python EXE逆向解密终极指南:从加密打包到源码还原
  • 终极音乐解锁指南:三分钟摆脱平台加密限制
  • 终极指南:快速构建基于Gemini和LangGraph的智能研究助手
  • 使用Miniconda-Python3.11运行数学公式识别LaTeX OCR