AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
正题
题目链接:
https://www.luogu.com.cn/problem/AT4352
https://atcoder.jp/contests/arc101/tasks/arc101_c
题目大意
nnn个点之间两两配对,要求配对点之间的路径覆盖整棵树,求方案数
解题思路
考虑容斥,我们钦定有lll条边没有路径覆盖,就有dpdpdp状态fi,j,lf_{i,j,l}fi,j,l表示iii的子树中,目前该子树的联通块大小为jjj,已经切断了lll条边,我们发现该状态已经是O(n3)O(n^3)O(n3)的,显然无法通过。
考虑优化,每个dpdpdp状态的容斥系数是(−1)l(-1)^l(−1)l,所以我们可以不用记录lll这一维度,之间用状态表示乘上了容斥系数的值。
那么我们就有dpdpdp方程,定义calc(x)calc(x)calc(x)表示xxx个点两两匹配的值
(−1)∗fx,i∗fy,j∗calc(j)→fx,i(-1)*f_{x,i}*f_{y,j}*calc(j)\rightarrow f_{x,i}(−1)∗fx,i∗fy,j∗calc(j)→fx,i
fx,i∗fy,j→fx,i+jf_{x,i}*f_{y,j}\rightarrow f_{x,i+j}fx,i∗fy,j→fx,i+j
该方程的复杂度就是每个子树的乘积,可以理解为每个点堆之间进行一次贡献,时间复杂度O(n2)O(n^2)O(n2)
calc(x)=∏i=1x−1[i&1==1]icalc(x)=\prod_{i=1}^{x-1}[i\&1==1]icalc(x)=∏i=1x−1[i&1==1]i
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5100,XJQ=1e9+7;
struct node{ll to,next;
}a[N*2];
ll n,tot,ls[N],siz[N],f[N][N],ans,g[N],fac[N];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dp(ll x,ll fa){siz[x]=f[x][1]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dp(y,x);for(ll i=1;i<=siz[x];i++)g[i]=f[x][i],f[x][i]=0;for(ll j=1;j<=siz[x];j++){for(ll k=1;k<=siz[y];k++){(f[x][j+k]+=f[y][k]*g[j]%XJQ)%=XJQ;if((k&1)==0)(f[x][j]+=XJQ-f[y][k]*g[j]%XJQ*fac[k-1]%XJQ)%=XJQ;}}siz[x]+=siz[y];}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}fac[0]=fac[1]=1;for(ll i=2;i<=n;i++)fac[i]=fac[i-2]*i%XJQ;dp(1,1);for(ll i=2;i<=n;i++)ans=(ans+f[1][i]*fac[i-1]%XJQ)%XJQ;printf("%lld",ans);
}
AT4352-[ARC101C] Ribbons on Tree【dp,容斥】相关推荐
- AT4352 [ARC101C] Ribbons on Tree
解析 其实想到了断边按连通块容斥的做法. 但不知道为啥觉得没前途弃了- 悲. 考虑容斥,设 f[x][i] 表示 x 子树内与 x 所连的联通块有 i 个节点的方案数,第三维朴素是记录连通块个数,但其 ...
- ARC101E Ribbons on Tree 树形dp 容斥
题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...
- BZOJ2339: [HNOI2011]卡农(dp 容斥)
题意 从$1 - n$中任意选择一些数,选$m$次构成$m$个集合 保证: 集合不为空 任意两个集合不相同 集合内各个元素xor起来等于0 Sol 神仙题Orz 我看到两种做法,一种是洛谷题解上的直接 ...
- CF296B dp\容斥
传送门 文章目录 题意: 思路: 题意: n≤1e5n\le1e5n≤1e5 思路: 求方案数基本就是考虑dpdpdp了,看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态. 设f[i][j]f ...
- [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...
- P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...
- bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1537 [Submit][St ...
- [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...
- [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)
Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...
最新文章
- VTK:图片之ImageSinusoidSource
- java加密字符串,可解密
- CCIE-LAB-第六篇-IPV6+SLLAC
- 每日一题(25)—— 自加++
- vs升级c++项目遇到的一些问题
- 大数据技术之Hadoop3.1.2版本完全分布式部署搭建
- Jmock-使用ClassImposteriser扩展mock class对象
- 一些不错的sql语句
- C语言二级题库带答案+解析
- Shell 编程入门到精通
- 一文读懂TOGAF企业架构
- Error:Excepted resource of type id
- 深圳市集体户户口簿首页pdf版获取指南
- walking机器人入门教程-单点导航
- 【swap】swap使用过高的处理方法
- 大数据学习之路-Hive
- 【学习笔记】投资理财,基金基础知识科普入门学习,凭运气赚回来的钱,会凭实力亏掉_20210115
- 《痞子衡嵌入式半月刊》 第 19 期
- Elastix 设置呼叫转移
- SpringBoot整合GraphQL第(一)章节
热门文章
- js请求结果拦截机器_CefSharp请求资源拦截及自定义处理
- linux mysql安装教程 方大帝_discuz论坛出现Can not connect to MySQL server错误的解决方法...
- 六元均匀直线阵的各元间距为_实验二 均匀直线阵
- linux mysql帮助文档,在 Linux 上安装 MySQL
- 攻城时服务器维护,8月31日服务器维护更新公告
- C++ 学习之旅(15)——继承inheritance
- [SpringSecurity]基本原理_过滤器链
- C++ vector容器中常见的三种遍历方式
- word文档相关使用
- GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)