【计数,DP】ABC306Ex Balance Scale
现在有 \(n\) 个球,每个球有一个重量,重量未知。接下来会进行 \(m\) 次称重,每次给定 \(a_i\) 和 \(b_i\),比较这两个球的重量,结果可能是 \(>,=,<\) 中的一种。求在所有 \(3^m\) 个结果中有几种是可能出现的。
\(n\le 17,m\le n(n-1)/2\)。
技巧:怎样配容斥系数
将 \((a_i,b_i)\) 视作一条边,就是给每条边定一个方向或者定相等,要求不能成环。
思路是假装我们已经枚举那些为 \(=\) 的边了,然后要求剩下的边形成一个 DAG。而枚举 \(=\) 的边的过程可以在接下来的 DP 中顺便做。
考虑如果不允许出现 \(=\) 的话怎么做。对于一个 DAG,处理它的方法当然是依次剥掉入度为 \(0\) 的点集。重点问题在于怎样避免算重。
考虑容斥,钦定一个点集 \(T_1\) 是当前 DAG 中所有入度为 \(0\) 的点集,其中 \(T_1\) 非空。接下来要容斥,于是枚举一个 \(T\supseteq T_1\) 为实际上真正入度为 \(0\) 的点集,那么容斥系数显然为 \((-1)^{|T|-|T_1|}\)。
于是可以列出转移方程 \(f(S)=\sum_{T_1\subseteq S,T_1\neq \varnothing}\sum_{T\supseteq T_1}(-1)^{|T|-|T_1|}f(S\setminus T)\)。
然后发现这个 \(T_1\) 意义不明,于是改为枚举 \(T\subseteq S\),则合法的 \(T_1\) 数量为 \(\sum_{T_1\subseteq T,T_1\neq \varnothing}(-1)^{|T|-|T_1|}=(-1)^{|T|-1}\)。
得到 \(f(S)=\sum_{T\subseteq S,T\neq \varnothing}(-1)^{|T|-1}f(S\setminus T)\)。
然后把 \(=\) 的边加进去,发现把 \(|T|\) 改成 \(c(T)\) 即可,其中 \(c(T)\) 表示 \(T\) 中的点的导出子图的连通块个数。
最终转移方程为 \(f(S)=\sum_{T\subseteq S,T\neq \varnothing}(-1)^{c(T)-1}f(S\setminus T)\)。
时间复杂度 \(O(3^n)\)。
点击查看代码
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int mod=998244353; using ll = long long;
int n,m,a[305],b[305],all,G[17],f[1<<17],cnt[1<<17];
inline void ck(int& x,int y) { x+=y-mod; x+=x>>31&mod; }
int main(){
cin>>n>>m; all=(1<<n)-1; For(i,0,n-1) G[i]|=1<<i;
For(i,1,m){
int x,y; cin>>x>>y; x--,y--; G[x]|=1<<y; G[y]|=1<<x; a[i]=x,b[i]=y;
}
For(s,0,all){
int fa[17]={0}; iota(fa,fa+n,0);
function<int(int)> getfa=[&](int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);};
For(i,1,m) if((s>>a[i]&1)&&(s>>b[i]&1)) fa[getfa(b[i])]=getfa(a[i]);
For(i,0,n-1) if((s>>i&1)&&fa[i]==i) cnt[s]++;
}
f[0]=1; For(s,1,all) for(int s0=s;s0;s0=(s0-1)&s) f[s]=(f[s]+1ll*f[s^s0]*(cnt[s0]&1?1:mod-1))%mod;
cout<<f[all]<<'\n';
return 0;
}
【计数,DP】ABC306Ex Balance Scale的更多相关文章
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- HDU4815/计数DP
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 计数dp
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...
- [SDOI2010]地精部落[计数dp]
题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
随机推荐
- 详解KubeEdge边缘网络项目EdgeMesh
摘要:本文带大家进一步了解 EdgeMesh 的进展以及未来的规划. 本文分享自华为云社区<走向成熟的KubeEdge边缘网络项目EdgeMesh详解>,作者:华为云云原生团队 王杰章 . ...
- 一文快速了解火山引擎 A/B 测试平台
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 一. 概述 A/B Testing 作为因果推断的「黄金标准」,是效果评估的利器. 火山引擎 A/B 测试(Dat ...
- 火山引擎 EMR StarRocks 场景案例分享
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前 ,火山引擎数智平台(VeDI)旗下产品 E-MapReduce(简称"EMR")正式上线 ...
- 如何在 Unity 游戏中集成 AI 语音识别?
简介 语音识别是一项将语音转换为文本的技术,想象一下它如何在游戏中发挥作用?发出命令操纵控制面板或者游戏角色.直接与 NPC 对话.提升交互性等等,都有可能.本文将介绍如何使用 Hugging Fac ...
- Python 网络舆情分析系统,舆论可视化界面
1 简介 舆情管理系统,这不仅仅可以帮助当地的管理人员迅速的排查跟本地有关的负面言论,还可以避免网民因为本身意识不到位而评论或发布一些不好的观点的情况,最终的目的就是帮助社会更好的发展. 2 技术栈 ...
- PDF转图片-itextpdf-java源码
提供PDF 文件转图片的工具类. 电子签章过程中存在着在网页上对签署文件进行预览.指定签署位置.文件签署等操作,由 于图片在浏览器上的兼容性和友好性优于PDF 文件,所以一般在网页上进行电子签章时,会 ...
- L2-024 部落 (25 point(s)) (并查集)
补题链接:Here 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查 ...
- MySQL 的 crash-safe 原理解析
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5i9wmJs4_Er7RaYfNnETyA作者:xieweipeng MySQL作为当下最流行 ...
- 【调试】sysRq按键使用方法
SysRq键简介 SysRq键是一个魔术案件,只要在内核没有完全卡死的情况下,内核都会相应SysRq 键的输入,使用这些组合键都可以搜集包括系统内存使用.CPU任务处理.进程运行状态等系统运行信息. ...
- vue项目部署的最佳实践
前言 使用vue.react.angular等技术开发过程中,我们都会遇到以下问题: 首屏加载慢 每一次更新都需要清除浏览器缓存才能看到效果(经常被测试吐槽) 这两个问题可以从很多方面进行优化,今天我 ...