ARC101E - Ribbons on Tree
题目链接
题解
令边集\(S \subseteq E\) 设\(f(S)\)为边集S中没有边被染色的方案数
容斥一下,那么\(ans = \sum_{S \subseteq E} (-1)^{ \| S\| f(S) }\)
那么如何求对于原边集的\(f(S)\),也就是把\(S\)集合中的边全部删掉之后的各联通块内匹配的乘积
设\(g(x)\)为大小为x的联通块内点两两匹配的方案
那么\(f(S)=\prod_{i=1}^{|S|+1}g(a_i)\)
考虑如何求ans
设\(dp[i][j]\)表示以i为跟的子树中,有j各点没有在子树种匹配(链接到父节点
转移背包一下
对于\(j=0\)的时候由于那么i节点到父亲的边是没有覆盖的,容斥系数要取反
那么
$ f[i][0]=\sum_{j=1}^{sz[i]}-1\times f[i][j]\times g(j) $
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(p,x,k) for(int p = x;p <= k;++ p)
#define per(p,x,k) for(int p = x;p >= k;-- p)
#define gc getchar()
#define pc putchar
#define LL long long
#define int long long
inline LL read() {
LL x = 0,f = 1;
char c = gc;
while(c < '0' || c > '9') c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c -'0',c = gc;
return x ;
}
void print(LL x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
const int maxn = 5007;
const int mod = 1e9 + 7;
int a[maxn];
int n;
struct node {
int v,next;
} edge[maxn << 1];
int num = 0,head[maxn];
inline void add_edge(int u,int v) {
edge[++ num].v = v; edge[num].next = head[u];head[u] = num;
}
int g[maxn];
int dp[maxn][maxn];
int siz[maxn];
void dfs(int x,int fa) {
static int t[maxn];
dp[x][1] = 1; siz[x] = 1;
for(int i = head[x];i;i = edge[i].next) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v,x);
for(int j = 0,kel = siz[v];j <= siz[x];++ j) {
for(int k = 0;k <= siz[v];++ k) {
(t[j + k] += 1ll * dp[x][j] * dp[v][k] % mod) %= mod;
}
}
siz[x] += siz[v];
for(int j = 0;j <= siz[x];++ j) dp[x][j] = t[j],t[j] = 0;
}
LL sum = 0;
for(int i = 0;i <= siz[x];i += 2) sum += mod - 1ll * dp[x][i] * g[i] % mod;
dp[x][0] = sum % mod;
}
main() {
n = read();
int u,v;
rep(i, 1,n - 1) {
u = read(),v = read();
add_edge(u,v);
add_edge(v,u);
}
g[0] = 1;
for(int i = 2;i <= n;i += 2) (g[i] = 1ll * g[i - 2] * (i - 1)) %= mod;
dfs(1,1);
print((mod - dp[1][0]) % mod);
return 0;
}
/*
4
1 2
1 3
1 4
*/
ARC101E - Ribbons on Tree的更多相关文章
- [ARC101E]Ribbons on Tree(容斥,dp)
Description 给定一棵有 \(n\) 个节点的树,满足 \(n\) 为偶数.初始时,每条边都为白色. 现在请你将这些点两两配对成 \(\frac{n}{2}\) 个无序点对.每个点对之间的的 ...
- ARC101E Ribbons on Tree 容斥原理+dp
题目链接 https://atcoder.jp/contests/arc101/tasks/arc101_c 题解 直接容斥.题目要求每一条边都被覆盖,那么我们就容斥至少有几条边没有被覆盖. 那么没有 ...
- Atcoder ARC101 Ribbons on Tree
题解: 前面牛客网的那个比赛也有一道容斥+dp 两道感觉都挺不错的 比较容易想到的是 f[i][j]表示枚举到了i点,子树中有j个未匹配 这样的话我们需要枚举儿子中匹配状态 这样是n^2的(这是个经典 ...
- ARC 101E.Ribbons on Tree(容斥 DP 树形背包)
题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...
- [atARC101E]Ribbons on Tree
令$f(E')$表示强制$E'$中的边不被覆盖的方案数,根据容斥,$ans=\sum_{E'\subseteq E}(-1)^{|E'|}f(E')$ 对于给定的$E'$,$f(E')$即将$E'$中 ...
- [ARC101C] Ribbons on Tree
神仙的容斥题与神仙的树形DP题. 首先搞一个指数级的做法:求总的.能够覆盖每一条边的方案数,通过容斥可以得到\(\text{ans}=\sum\limits_E{(-1)^{|E|}F(E)}\).其 ...
- Solution -「ARC 101E」「AT 4352」Ribbons on Tree
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,其中 \(2|n\),你需要把这些点两两配对,并把每对点间的路径染色.求使得所有边被染色的方案数 ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- 【AtCoder】ARC101题解
C - Candles 题解 点燃的一定是连续的一段,枚举左端点即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #de ...
随机推荐
- 编辑方法分享之如何编辑PDF文件内容
我们现在在工作中会经常使用到PDF文件,还会有遇到需要编辑PDF文件的时候,PDF文件的编辑问题一直是个大难题.很多朋友在面对PDF文件的时候束手无策,不知道该怎么对它进行编辑.下面小编就教给大家一个 ...
- python(1):数据类型/string/list/dict/set等
本系列文章中, python用的idle是spyder或者pycharm, 两者都很好用, spyder 是在anaconda 中的, 自带了很多包可以用, pycharm 只是个编译器, 没有很多包 ...
- 20165314 2016-2017-2 《Java程序设计》第3周学习总结
20165314 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 类体包含成员变量和域变量 局部变量只在方法内有效 对象的创建以及对象对自己变量和方法通过用. ...
- vue中Axios的封装和API接口的管理
前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习.如果对原博主造成侵犯,我会立即删除. 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题 ...
- golang 打包,交叉编译,压缩
打包,压缩 我们的常规打包方式 $ go build Mac下我们用 ls -lh查看,可以看到我们打包出来的可执行文件会比较大,一般只写几行代码就回又3M以上的文件大小了. 我们的带压缩的打包方式 ...
- jenkins卡在等待界面解决方法
1.安装jenkins最新版的时候,发现一直卡在等待界面上 如图显示: 原因:jenkins里面文件指向国外的官网,因为防火墙的原因连不上 解决方法:将配置文件里面的url换成国内的即可
- Navicat Premium 12.1.8.0安装与激活
本文介绍Navicat Premium 12.1.8.0的安装.激活与基本使用. 博主所提供的激活文件理论支持Navicat Premium 12.0.x系列和Navicat Premium 12.1 ...
- SqlServerHelp
using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Sy ...
- python-中缀表达式转前缀表达式
作完了中缀前缀,作一个归纳吧. https://www.cnblogs.com/unixfy/p/3344550.html # coding = utf-8 class Stack: def __in ...
- Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://slaver1:9000/user/hadoop/tb_user already exists
1.当时初学Sqoop的时候,mysql导入到hdfs导入命令执行以后,在hdfs上面没有找到对应的数据,今天根据这个bug,顺便解决这个问题吧,之前写的http://www.cnblogs.com/ ...