\(\mathcal{Description}\)

  Link.

  给定一棵 \(n\) 个点的树,其中 \(2|n\),你需要把这些点两两配对,并把每对点间的路径染色。求使得所有边被染色的方案数,对 \(10^9+7\) 取模。

  \(n\le5000\)。

\(\mathcal{Solution}\)

  容斥,令 \(f(S)\) 表示钦定边集 \(S\) 全部为被覆盖的方案数。显然答案为:

\[\sum_{S\subseteq E}(-1)^{|S|}f(S)
\]

  \(S\) 的断边相当于把原树切分为联通块,且块内可以任意配对。令 \(g(n)\) 表示大小为 \(n\) 的块任意配对的方案数,则:

\[g(n)=\begin{cases}
[n=2]&n\le2\\
(n-1)g(n-2)&\text{otherwise}
\end{cases}
\]

  理解上,考虑在 \(g(n-2)\) 的基础上新加两个点。则可以拆开原来的一对点和这两个点配对,方案数 \(\frac{n-2}2\times2\);这两个点亦可直接配对,方案数 \(1\)。

  利用树上 DP 求解,令 \(h(u,i)\) 表示 \(u\) 子树内有 \(i\) 个点与 \(u\) 连通的方案数。树上背包转移:

\[h(u,i)=\sum h(v,j)h(w,i-j)
\]

  特别地,\(h(u,0)\) 表示 \(u\) 与父亲被切断,即 \(u\) 成为独立连通块。这是考虑容斥系数进行转移:

\[h(u,0)=-\sum h(u,i)g(i)
\]

  答案即为 \(-g(root,0)\)。

\(\mathcal{Code}\)

#include <cstdio>

const int MAXN = 5000, MOD = 1e9 + 7;
int n, ecnt, head[MAXN + 5], siz[MAXN + 5];
int g[MAXN + 5], f[MAXN + 5][MAXN + 5]; struct Edge { int to, nxt; } graph[MAXN * 2 + 5]; inline void addeq ( int& a, const int b ) { if ( ( a += b ) >= MOD ) a -= MOD; } inline void link ( const int s, const int t ) {
graph[++ ecnt] = { t, head[s] };
head[s] = ecnt;
} inline void solve ( const int u, const int fa ) {
static int tmp[MAXN + 5];
f[u][1] = siz[u] = 1;
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa ) {
solve ( v, u );
for ( int j = 1; j <= siz[u] + siz[v]; ++ j ) tmp[j] = 0;
for ( int j = 0; j <= siz[v]; ++ j ) {
for ( int k = 1; k <= siz[u]; ++ k ) {
addeq ( tmp[j + k], 1ll * f[v][j] * f[u][k] % MOD );
}
}
for ( int j = 1; j <= siz[u] + siz[v]; ++ j ) f[u][j] = tmp[j];
siz[u] += siz[v];
}
}
for ( int i = 2; i <= siz[u]; i += 2 ) addeq ( f[u][0], 1ll * f[u][i] * g[i] % MOD );
f[u][0] = ( MOD - f[u][0] ) % MOD;
} int main () {
scanf ( "%d", &n );
for ( int i = 1, u, v; i < n; ++ i ) {
scanf ( "%d %d", &u, &v );
link ( u, v ), link ( v, u );
}
g[0] = 1;
for ( int i = 2; i <= n; i += 2 ) g[i] = ( i - 1ll ) * g[i - 2] % MOD;
solve ( 1, 0 );
printf ( "%d\n", ( MOD - f[1][0] ) % MOD );
return 0;
}

Solution -「ARC 101E」「AT 4352」Ribbons on Tree的更多相关文章

  1. Solution Set -「ARC 107」

    「ARC 107A」Simple Math   Link.   答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...

  2. 「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】

    「ARC 139F」Many Xor Optimization Problems 对于一个长为 \(n\) 的序列 \(a\),我们记 \(f(a)\) 表示从 \(a\) 中选取若干数,可以得到的最 ...

  3. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  4. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  5. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  6. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  7. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  8. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  9. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

随机推荐

  1. Tomcat8/9的catalina.out中文乱码问题解决

    OS: Red Hat Enterprise Linux Server release 7.8 (Maipo) Tomcat: 9 中文显示为???问号 在$CATALINA_HOME/conf下的l ...

  2. HTTP 408 问题 - Koa body parser

    环境描述: 1.nodejs 作为 api 服务器,转发请求给 nginx 2.用 curl 测试,返回 408 找了很久没有找到原因,发现了一篇文章: https://lujunda.cn/2016 ...

  3. EgLine V0.3—LVGL官方拖拽式UI编辑工具(可导出代码)

    ** EdgeLine ** 是LVGL官方团队退出的一款拖拽式UI编辑工具,现在还处于测试间断,目前最新版本为v0.3,已经可导出代码. 注意: 使用该软件需要注册lvgl账号,这一步可能需要代理 ...

  4. HDU 1106 (1.3.5) 排序 (C语言描述)

    排序 Problem Description 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非 ...

  5. markdownFormat

      对文档编辑主要还是用wps,因为以前毕业论文都是用的它来编排(刚开始用wps毕业论文的时候真的是用的想吐,感觉非常不好用,而且功能太多但对于自己需要的功能又偏偏找不到),用过几次后还觉得用它编辑文 ...

  6. 数组内sizeof与strlen的区别

    1.数组在内存中是连续存放的,地址呈4个字节递增 2.数组的定义需要初始化,否则输出会已随机值输出 3.strlen()和sizeof()之间无关联:strlen():是求字符串长度的----只能针对 ...

  7. 【刷题-LeetCode】210. Course Schedule II

    Course Schedule II There are a total of n courses you have to take, labeled from 0 to n-1. Some cour ...

  8. 【笔记】golang中使用protocol buffers的底层库直接解码二进制数据

    背景 一个简单的代理程序,发现单核QPS达到2万/s左右就上不去了,40%的CPU消耗在pb的decode/encode上面. 于是我想,对于特定的场景,直接从[]byte中取出字段,而不用完全的把整 ...

  9. python+fastdfs+nginx实现打包下载功能

    环境介绍:生产服务器开发人员需要给client下发数据,主要是图片及视频:图片服务器用fastdfs,下载由nginx 来提供: java 程序来调用此脚本,传递参数来决定打包文件内容: #!/usr ...

  10. Kindle连接移动的 Wi-Fi 时要求进行网页浏览器登陆怎么办?

    在电脑上新建一个新文件,名为"WIFI_NO_NET_PROBE",同时把后缀名删掉,让它变成一个无格式文件.Kindle 连接电脑,把新建的文件放进Kindle的根目录,断开Ki ...