AT2390-[AGC016F]Games on DAG【状压dp,SG函数】
正题
题目链接:https://www.luogu.com.cn/problem/AT2390
解题思路
\(n\)个点的\(DAG\),\(m\)条边可有可无,\(1\)和\(2\)上有石头。求有多少种方案使得先手必胜。
\(1\leq n\leq 15,1\leq m\leq \frac{n(n-1)}{2}\)
解题思路
这个复杂度比较麻烦,要设计一个比较巧妙的\(dp\)。
考虑到题目是问多少种情况\(SG(1)\neq SG(2)\),其实求\(SG(1)=SG(2)\)的方案会更简单些。
设\(f_{S}\)表示目前只考虑了生成子图\(S\)时\(SG(1)=SG(2)\)的方案数,那么若从\(T\)转移到\(S\)时我们可以构造一种方案使得\(T\)的所有点内的\(SG\)加一,然后\(S/T\)的所有点的\(SG\)为\(0\)。
也就相当于我们把点按照\(SG\)大小分成若干层,然后一层一层转移进去。好了现在考虑怎么转移\(f_S\),我们枚举它的子集\(T\),那么\(S/T\)就是它的下一层,也就是目前\(S/T\)内的点\(SG=0\)。
对于\(T\)内的每个点,我们需要连接至少一个\(S/T\)内的点,对于\(S/T\)内的点,可以随意连接\(T\)内的点,枚举一下点集统计方案就好了。
时间复杂度\(O(3^nn)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=15,P=1e9+7;
ll n,m,ans,f[1<<N],c[1<<N],e[N];
vector<int>q[N];
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
x--;y--;e[x]|=(1<<y);
}
ll MS=(1<<n),o=0;c[0]=1;
for(ll i=1;i<MS;i++)c[i]=c[i-(i&-i)]*2;
for(ll s=0;s<MS;s++){
if((s&1)!=((s>>1)&1))continue;
f[s]=1;
for(ll t=(s-1)&s;t;t=(t-1)&s){
ll buf=f[t];
for(ll i=0;i<n;i++){
if((t>>i)&1)buf=buf*(c[(s^t)&e[i]]-1)%P;
if(((s^t)>>i)&1)buf=buf*c[t&e[i]]%P;
}
(f[s]+=buf)%=P;
}
}
ll ans=1;
while(m)m--,ans=ans*2%P;
printf("%lld\n",(ans-f[MS-1]+P)%P);
return 0;
}
AT2390-[AGC016F]Games on DAG【状压dp,SG函数】的更多相关文章
- AGC 016 F - Games on DAG(状压dp)
题意 给你一个有 \(n\) 个点 \(m\) 条边 DAG 图,点的标号和拓扑序一致. 现在有两个人进行博弈,有两个棋子分别在 \(1, 2\) 号点上,需要不断移动到它指向的点上. 如果当前两个点 ...
- DAG求最短路--TSP变形--状压dp
DAG状压dp的一种 题目: $m$个城市,$n$张车票,第i张车票上的时间是$t_i$, 求从$a$到$b$的最短时间,如果无法到达则输出“impossible” 解法: 考虑状态:“现在在城市$v ...
- 【XSY3042】石像 拓扑排序 状压DP 洲阁筛
题目大意 有 \(n\) 个整数 \(a_1,a_2,\ldots,a_n\),每个数的范围是 \([1,m]\).还有 \(k\) 个限制,每个限制 \(x_i,y_i\) 表示 \(a_{x_i} ...
- 【状压DP】poj2686 Traveling by Stagecoach
状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可. #include<cstdio> #include< ...
- UVA 1412 Fund Management (预处理+状压dp)
状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...
- 状压dp专题复习
状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
随机推荐
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
- 物联网协议Coap协议介绍
COAP协议简介 Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252.COAP名字翻译来就是" ...
- Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- Spring之AspectJ
时间:2017-2-4 21:12 --AspectJ简介1.AspectJ是一个基于Java语言的AOP框架.2.Spring2.0以后新增了对AspectJ切点表达式的支持.3.@AspectJ是 ...
- 设计模式<一>
设计原则1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是针对实现编程. 3.多用组合,少用继承. 一:策略模式,定义了算法族,分别封装起来 ...
- netty系列之:轻轻松松搭个支持中文的服务器
目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都是讲 ...
- 类的基础语法阅读【Python3.8官网文档】
英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...
- Python - 通过PyYaml库操作YAML文件
PyYaml简单介绍 Python的PyYAML模块是Python的YAML解析器和生成器 它有个版本分水岭,就是5.1 读取YAML5.1之前的读取方法 def read_yaml(self, pa ...
- markdown的骚气操作(一)
markdown 系列其他内容 markdown的骚气操作(一)✓ latex的骚气操作(二) 本文目标 主要介绍markdown锚点.索引脚注.对勾及选择框.表格显示位置和符号显示位置.绘制 ...
- throw关键字
1.基础用法 2.方法中加合法校验,告知方法的调用者 数组越界判断 3.一切皆为对象,创建的是运行期对象,则可以不处理(throws/try catch),直接交给JVM处理(打印并终止程序) 4.O ...