Atcoder CF 2017 TR I
Atcoder CF 2017 TR I
给定一个有n个点,m条边的图,求为每条边定向,使得从1出发和2出发的两个人可以见面的方案数。
先把问题转换成求all-不能见面的方案数。那么可以把图划分成这样一个集合:

用\(f[0/1][i]\)表示包含0/1的集合i,从0/1出发刚好能到达所有点的方案数 。注意是“刚好“,所以统计的是闭合子图。利用容斥原理求出f,接下来的任务就是统计other集合中,与两个集合不相关的边的个数即可。
#include <cstdio>
using namespace std;
const int maxn=20, maxm=120, maxs=4e4, p=1e9+7;
int n, m, a[maxm], b[maxm], c[maxs], d[maxs], mi2[maxm];
long long f[2][maxs], ans;
//f[0/1][i]表示包含0/1的集合i,从0/1出发刚好能到达所有点的方案数
int main(){
scanf("%d%d", &n, &m);
for (int i=mi2[0]=1; i<maxm; ++i)
mi2[i]=mi2[i-1]*2%p;
for (int i=0; i<m; ++i){
scanf("%d%d", &a[i], &b[i]); //a b 存边
--a[i]; --b[i]; }
for (int i=0; i<(1<<n); ++i)
for (int j=0; j<m; ++j){
if ((i>>a[j]&1)&&(i>>b[j]&1)) ++c[i]; //c:两边都在s中的点数
if ((i>>a[j]&1)||(i>>b[j]&1)) ++d[i]; //d:恰好一个点在s中的点数
}
for (int i=0; i<2; ++i)
for (int j=0; j<1<<n; ++j){
if ((j>>i&1)==0) continue;
f[i][j]=mi2[c[j]];
for (int k=j; k>0; k=(k-1)&j) //注意是“刚好能到所有点”
f[i][j]=(f[i][j]+p-f[i][j-k]*mi2[c[k]])%p;
}
for (int i=0; i<1<<n; ++i){
for (int j=0; j<1<<n; ++j){
if ((i&j)||c[i]+c[j]!=c[i|j]) continue;
ans=(ans+f[0][i]*f[1][j]%p*mi2[m-d[i|j]])%p; //不与集合相连的边随便选
}
}
printf("%lld\n", (mi2[m]-ans+p)%p);
return 0;
}
Atcoder CF 2017 TR I的更多相关文章
- 小trick总结
一个圆上的整点数量不会很多.(Cf AIM TR 5 F) 二分图完美匹配求字典序最小的方案:先一遍匈牙利求出任意一组完美匹配.再跑一遍逐位确定,要求不能修改编号比它小的匹配.(LG 4100) 如果 ...
- 爬虫入门二 beautifulsoup
title: 爬虫入门二 beautifulsoup date: 2020-03-12 14:43:00 categories: python tags: crawler 使用beautifulsou ...
- 2017国家集训队作业Atcoder题目试做
2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...
- [AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp
[Atcoder Code Festival 2017 QualB/At3575] 101 to 010 有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次? 考虑像 11 ...
- AtCoder Regular Contest 103 E Tr/ee
Tr/ee 思路:按照下图所示连接 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #inclu ...
- 【AtCoder】CODE FESTIVAL 2017 Final
A - AKIBA 模拟即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair ...
- 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring
[题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
题目链接:http://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_c 题意:给出一个含 n ...
- AtCoder Regular Contest 075 2017年6月4日 C、D、E题解
http://arc075.contest.atcoder.jp/assignments 昨晚做的atcoder,今天写个简单题解. F题不会做,800point的,就跪了,要等zk大佬来做.zk能做 ...
随机推荐
- STM32 -- 硬件知识
一.网站资源 1.http://www.stmcu.com.cn/ 二.硬件 1.BOOT0 和 BOOT1 1)一般BOOT0和BOOT1跳线都跳到0(地): 只是在ISP下载的情况下,BOO ...
- AngularJS:Bootstrap
ylbtech-AngularJS:Bootstrap 1.返回顶部 1. AngularJS Bootstrap AngularJS 的首选样式表是 Twitter Bootstrap, Twitt ...
- Oracle 数据库加密
数据加密 动态数据(data in motion)和静态数据(data at rest),除了手动加密,其他的加密都需要oracle企业版的高级加密(额外收费——) 1 静态数据加密 Example ...
- 关于多账套API的设计
帐套在财务核算中是记载一个独立核算的经济实体的所有往来信息的一整套记录表和统计分析报表.不同的帐套之间的关系是相对独立的,对其中的任何一个帐套中的数据进行建立.删除或修改都不会影响其他帐套.在ERP中 ...
- 部署和调优 3.1 dns安装配置-1
安装配置DNS服务器 装一个bind,首先搜一下. yum list |grep bind bind.x86_64 我们安装这个 安装 yum install bind.x86_64 -y 看一下 ...
- MySQL中的多表插入更新与MS-SQL的对比
MySQL多表插入: INSERT INTO tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_c ...
- Jquery前端选择器
----------------------祖先后代选择器------------------------------ 1.祖先 后代:根据一个元素可以取得指定的所有子元素(不管中间有多少后代)$(& ...
- c++ vector用法和迭代器
1.在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. (1)头文件#include<vector>. (2)创建vector对象,vector<int> ...
- python爬虫(4)--Cookie的使用
Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...
- 【总结整理】dojo学习
Dojo Toolkit 的特性可以分到 4 个不同部分.这种划分使得开发人员可以将库大小保持到最小,确保应用程序性能不受大量 JavaScript 库下载的影响.例如,如果您只需要 Ajax 支持性 ...