Problem Link

现在有 \(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的更多相关文章

  1. HDU5800 To My Girlfriend 背包计数dp

    分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...

  2. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  3. [DP之计数DP]

    其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...

  4. HDU4815/计数DP

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...

  5. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  6. 计数dp

    计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...

  7. [SDOI2010]地精部落[计数dp]

    题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...

  8. 【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是素数 ...

  9. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  10. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

随机推荐

  1. 撬动百亿VRAR产业,让VR们“造”起来

    摘要:四大亮点抢先看,12月28-29日不见不散! 随着5G商用的加速及元宇宙.数字人等概念的兴起,虚拟现实技术作为未来世界的入口,正受到越来越多的关注,也将成为驱动数字经济发展和产业转型升级的关键技 ...

  2. 火山引擎数智平台最新直播活动:ByteHouse技术架构与最佳实践分享

    数据的时效性,正深刻影响着企业的发展.   以大型半导体制造厂商为例,不同于常规工厂生产流水线,半导体制造通用的无人实验室生产模式高度依赖机械臂作业,且对整个生产调度链路中的精密度要求非常高,这背后主 ...

  3. 抓包工具 Fiddler 抓取 exe 包

    浏览器访问网页,可以使用 Fiddler 直接抓去,如果是 exe的客户端,可以借助 Proxifier 工具 设置完成后,添加代理规则,排除fiddler,也就是让fiddler进行网络直连.不然f ...

  4. 【django-vue】主页前端搭建 git介绍和安装 git工作流程 git常用命令 git过滤文件 重写drf方法 跨域中间件 导出项目依赖

    目录 上节回顾 1 主页前端 Header组件 Banner组件 Footer组件 2 git介绍和安装 git和svn比较 pycharm中配置git svn,git ,github,gitee,g ...

  5. 记一次go应用在k8s pod已用内存告警不准确分析

    版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处( https://www.cnblogs.com/mikevictor07/p/17968696.html ),以下内容为个人 ...

  6. #1198:Farm Irrigation(DFS + 并查集)

    Farm Irrigation **Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...

  7. Codeforces Round #665 (Div. 2) A - D题题解

    成功拼手速提前过了AC两题,估计因为这个原因排名挺高的,B题晚上做的时候没绕出来,wa4发... 1401A - Distance and Axis 如果 \(n\) 小 于 \(k\) ,则必须将\ ...

  8. Java 并发编程之 JMM & volatile 详解

    本文从计算机模型开始,以及CPU与内存.IO总线之间的交互关系到CPU缓存一致性协议的逻辑进行了阐述,并对JMM的思想与作用进行了详细的说明.针对volatile关键字从字节码以及汇编指令层面解释了它 ...

  9. OpenSCA受邀出席2023 Open Compliance Summit

    近日,由Linux基金会主办的2023 Open Compliance Summit(开放合规峰会,简称OCS)在日本东京隆重召开.悬镜安全旗下全球极客开源数字供应链安全社区OpenSCA受邀参与,O ...

  10. js判断undefined

    if (item2.shifoushiyong === 1) { if( typeof(item2.koufen) == "undefined" ) { item2.koufen ...