[atARC101E]Ribbons on Tree
令$f(E')$表示强制$E'$中的边不被覆盖的方案数,根据容斥,$ans=\sum_{E'\subseteq E}(-1)^{|E'|}f(E')$
对于给定的$E'$,$f(E')$即将$E'$中所有边删除,连通块内部的匹配方案数乘积:若连通块大小为奇数,则必然为0;若连通块大小为偶数,设为$2n$,则方案数为$\frac{(2n)!}{n!2^{n}}$(以下记为$g(2n)$)
考虑dp来计算,令$f[i][j]$表示以$i$为根的子树中,与$i$相连的连通块大小为$j$的方案数(方案数不仅指删边,还需要将已经独立的连通块配对,且带有符号)
转移对$i$到子树内的边是否删除分类讨论:1.不删除,$f[i][x+y]=\sum f[i][x]\cdot f[son][y]$;2.删除,还需要变号,$f[i][x]*=-\sum g(y,0)f[son][y]$,最终答案即$\sum_{i=0}^{n}g(i)\cdot f[1][i]$
每一个点向上转移复杂度不超过为$(sz[fa]-sz[k])sz[k]$,累加起来即$sz[1]^{2}$,总时间复杂度为$o(n^{2})$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 #define mod 1000000007
5 struct ji{
6 int nex,to;
7 }edge[N<<1];
8 int E,n,x,y,ans,head[N],sz[N],g[N],ff[N],f[N][N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 void dfs(int k,int fa){
15 sz[k]=f[k][1]=1;
16 for(int i=head[k];i!=-1;i=edge[i].nex)
17 if (edge[i].to!=fa){
18 dfs(edge[i].to,k);
19 for(int j=1;j<=sz[k];j++)ff[j]=f[k][j];
20 for(int j=1;j<=sz[k];j++)f[k][j]=0;
21 for(int j=1;j<=sz[k];j++)
22 for(int t=1;t<=sz[edge[i].to];t++){
23 f[k][j+t]=(f[k][j+t]+1LL*ff[j]*f[edge[i].to][t])%mod;
24 f[k][j]=(f[k][j]+mod-1LL*g[t]*f[edge[i].to][t]%mod*ff[j]%mod)%mod;
25 }
26 sz[k]+=sz[edge[i].to];
27 }
28 }
29 int main(){
30 g[0]=1;
31 for(int i=1;i<N-4;i++)
32 if (i&1)g[i]=0;
33 else g[i]=1LL*g[i-2]*(i-1)%mod;
34 scanf("%d",&n);
35 memset(head,-1,sizeof(head));
36 for(int i=1;i<n;i++){
37 scanf("%d%d",&x,&y);
38 add(x,y);
39 add(y,x);
40 }
41 dfs(1,0);
42 for(int i=1;i<=n;i++)ans=(ans+1LL*g[i]*f[1][i])%mod;
43 printf("%d",ans);
44 }
[atARC101E]Ribbons on Tree的更多相关文章
- ARC101E - Ribbons on Tree
题目链接 ARC101E - Ribbons on Tree 题解 令边集\(S \subseteq E\) 设\(f(S)\)为边集S中没有边被染色的方案数 容斥一下,那么\(ans = \sum_ ...
- Atcoder ARC101 Ribbons on Tree
题解: 前面牛客网的那个比赛也有一道容斥+dp 两道感觉都挺不错的 比较容易想到的是 f[i][j]表示枚举到了i点,子树中有j个未匹配 这样的话我们需要枚举儿子中匹配状态 这样是n^2的(这是个经典 ...
- ARC 101E.Ribbons on Tree(容斥 DP 树形背包)
题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...
- [ARC101E]Ribbons on Tree(容斥,dp)
Description 给定一棵有 \(n\) 个节点的树,满足 \(n\) 为偶数.初始时,每条边都为白色. 现在请你将这些点两两配对成 \(\frac{n}{2}\) 个无序点对.每个点对之间的的 ...
- ARC101E Ribbons on Tree 容斥原理+dp
题目链接 https://atcoder.jp/contests/arc101/tasks/arc101_c 题解 直接容斥.题目要求每一条边都被覆盖,那么我们就容斥至少有几条边没有被覆盖. 那么没有 ...
- [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 ...
随机推荐
- Java基础之(七):Scanner对象
用户交互Scanner Scanner对象 调用java.util.Scanner 可以通过Scanner类来获取用户的输入 基本语法: Scanner scanner = new Scanner(S ...
- 试题 历届试题 翻硬币 java题解
问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...
- 【错误分析】NX error status: 32
在进行NX 制图里面的表格注释合并单元格时,总是报错NX error status: 32,找了很久都不知道问题所在. 报错提示如下: NXOpen.NXException: NX error sta ...
- Windows内核开发-10-监听对象
Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...
- 【Spring】IoC容器 - 依赖注入
前言 上一篇文章已经学习了[依赖查找]相关的知识,这里详细的介绍一下[依赖注入]. 依赖注入 - 分类 因为自己是基于小马哥的脉络来学习,并且很认可小马哥梳理的分类方式,下面按照小马哥思想为[依赖注入 ...
- 【UE4 C++】打印字符串与输出日志
打印屏幕 默认打印屏幕 // 打印至屏幕 FString screenMessage = "(AddOnScreenDebugMessage) Hello world!"; GEn ...
- [敏捷软工团队博客]Beta阶段测试报告
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...
- UVA-1498 Activation
UVA-1498 DP应该是肯定的,设 f [ i ] [ j ] 表示现在对中共有 i 人,Tomato在第 j 个,出现所求情况的概率,我们可以很(简单的)艰难的列出下列方程: f[i][1] = ...
- 零基础要怎么样学习嵌入式Linux--走进嵌入式
零基础要怎么样学习嵌入式希望可以通过这一篇帖子让大家走进嵌入式,对嵌入式的学习不再那么陌生. 嵌入式Linux工程师的学习需要具备一定的C语言基础,因此面对许多朋友只是在大一或者大二学习过C(还不一定 ...
- Github点赞超多的Spring Boot学习教程+实战项目推荐!
Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐! 很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...