当前位置: 首页 > 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.jsqmd.com/news/169839/

相关文章:

  • STM32 Bootloader电路在KiCad中的实现完整示例
  • Adafruit_SH1106图形库:让OLED屏幕开发变得轻松简单
  • Miniconda-Python3.11镜像支持国产化操作系统统信UOS
  • WeChatBot_WXAUTO_SE:打造智能拟人化微信聊天机器人的完整指南
  • 使用Miniconda-Python3.11运行语音情绪识别模型
  • PyTorch模型转ONNX格式|Miniconda-Python3.11镜像环境实操
  • 10分钟快速掌握Vue智能数据表格组件
  • Markdown撰写技术博客|Miniconda-Python3.11镜像记录PyTorch实验过程
  • 从网页到设计稿:html2sketch 高效转换指南
  • Widevine L3 DRM 绕过工具使用指南
  • 10分钟搭建个人阅读平台:免费小说API终极指南
  • 革命性工业视觉解决方案:shape_based_matching实战全解析
  • 如何快速解决GitHub访问难题:一站式Hosts同步方案
  • 重新定义百度网盘下载体验:3大技术突破的创新方案
  • emwin电源管理与驱动休眠联动
  • Nucleus Co-op:单机游戏分屏技术深度解析与实战指南
  • 终极RetroArch界面美化:快速解决图标缺失和字体异常问题
  • 如何快速掌握DownKyi:面向新手的B站音频提取完整操作手册
  • FIFA 23实时编辑器:解锁游戏无限可能的全能工具箱
  • 跨平台图像处理实战指南:从零掌握计算机视觉核心技术
  • 清华源配置指南|加速Miniconda-Python3.11镜像中的PyTorch依赖下载
  • ollydbg下载及安装完整示例:附带汉化包配置
  • 5分钟掌握Python EXE逆向分析:实战源码提取完整指南
  • PoeCharm完整指南:快速掌握流放之路Build构建技巧
  • CAJ转PDF全攻略:开源工具助您实现学术文献便捷访问
  • Windows下Miniconda-Python3.11镜像安装PyTorch GPU版本详细步骤
  • 2025年12月文具设计团队推荐榜单:优秀机构排行 - 2025年品牌推荐榜
  • WinDiskWriter完全手册:macOS上制作Windows启动盘的终极解决方案
  • 零基础入门:5分钟掌握工业级形状匹配技术
  • 缠论Python框架实战指南:高效构建智能交易策略