AT2390 Games on DAG

题意

\(1,2\) 号点各一个石头,每次沿边移动一个石头,不能动者输。求所有连边子集中先手胜的情况。

思路

发现对于两个石头的 SG 函数是独立的,输者两个石头 SG 函数异或值为 0,那么先手胜的情况就是所有情况减去这种情况。

对于所有 SG 函数为 \(v\) 的点,它们必须向 SG 函数小于 \(v\) 的所有点连至少一条边,对大于 \(v\) 的连边没有约束,并且互相不能连边。

所以我们可以枚举当前图的 SG 函数为 0 的点,这样所有其他点都至少向它们连一条边,而它们之间不连边,它们向其他点连边任意。于是对于剩下点的连通子图,我们又可以将所有点的 SG 函数减 1,使它又可以枚举 SG 函数为 0 的点。

于是我们可以 DP。设 \(f_S(1,2\in S)\) 为对于 \(S\) 所有连通子图满足 1,2 SG 函数相等的方案数。

转移时枚举 \(S\) 的子集 \(T\),使 \(1,2\in T\) 或 \(1,2\not \in T\)。对于前者情况,\(T\) 对于 \(S\) 的补集为 SG 函数为 0 的点,从 \(f_T\) 转移即可。对于后者情况,1,2 SG 函数为 0,\(T\) 中的边随便连。

DP 前预处理出所有集合对每个点的连边条数。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=x*10+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=15,mod=1e9+7;
int n,m,a[maxn][maxn],f[1<<maxn],c[1<<maxn][maxn],pow[maxn*maxn];
inline void work(){
n=read(),m=read();
pow[0]=1;for(int i=1;i<=m;i++) pow[i]=(pow[i-1]<<1)%mod;
for(int x,y,i=1;i<=m;i++) x=read()-1,y=read()-1,a[x][y]=1;
for(int d=1;d<1<<n;d++){
int j=0;
while(~d>>j&1)++j;
for(int x=0;x<n;x++) c[d][x]=c[d^1<<j][x]+a[x][j];
}
for(int d=0;d<1<<n;d++) if((d&3)==3){
f[d]=1;
for(int t=d&(d-1);t;--t&=d) if((t&1)==(t>>1&1)) if(t&1){
int res=1;
for(int i=0;i<n;i++) if(t>>i&1) res=1ll*res*(pow[c[d^t][i]]-1)%mod;
else if(d>>i&1) res=1ll*res*pow[c[t][i]]%mod;
f[d]=(f[d]+1ll*res*f[t])%mod;
}else{
int res=1;
for(int i=0;i<n;i++) if(t>>i&1) res=1ll*res*(pow[c[d^t][i]]-1)%mod*pow[c[t][i]]%mod;
else if(d>>i&1) res=1ll*res*pow[c[t][i]]%mod;
f[d]=(f[d]+res)%mod;
}
}
printf("%d\n",(pow[m]-f[(1<<n)-1]+mod)%mod);
}
}
signed main(){
star::work();
return 0;
}

最新文章

  1. Gumby – 基于 Sass 的灵活的,响应式 CSS 框架
  2. mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间
  3. 归档 Archive、解档Unchive、 XML(一)
  4. SSH_框架整合1
  5. Linux系统分区
  6. 31.Spring-开发流程.md
  7. AJAX校验商品价格(类似校验用户名)
  8. php 1到100累加 新方法
  9. RMAN数据库恢复测试
  10. 使用路由延迟加载 Angular 模块
  11. 验证码 jsp
  12. 一:学习Linux前准备工作
  13. 实现mypwd
  14. Git 撤销所有未提交(Commit)的内容
  15. 分享一个爬取HUST(哈理工)学生成绩的Python程序(OCR自动识别验证码)
  16. JavaScript 编码规范(中文/Airbnb公司版)
  17. &lt;kafka&gt;&lt;应用场景&gt;&lt;Kafka VS Flume&gt;
  18. Elasticsearch重要文章之四:监控每个节点(ThreadPool部分)
  19. scss 使用
  20. 有效利用番茄工作法提高效率--XorTime的使用方法

热门文章

  1. java容器学习笔记
  2. Python 5种方法实现单例模式
  3. Kubernetes 实战——配置应用(ConfigMap、Secret)
  4. 【NX二次开发】切换模块的方法,切换到制图模块
  5. 【NX二次开发】UF_OBJ_ask_display_properties获取对象所在层、获取对象颜色、获取对象是否隐藏、获取对象是否高亮,获取对象线宽、字体大小
  6. 基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑
  7. 【C语言】整型在内存中的存储
  8. hive学习笔记之五:分桶
  9. excel函数提取内容中的汉字
  10. 2、配置tomcat-service服务