Codeforces 1221 G Graph And Numbers
这种比赛时只有11个人做出来的题一般来说都是暴难的, 我也不知道我怎么搞出来的www
看完这个题第一感觉就是要容斥,至少有一条某种边的方案已经比较难求了,而直接算三种边都至少存在一条的方案数就更难了2333
那么不妨考虑从反面容斥吧
设把三种边的存在情况表示成三进制的话,1表示至少有一条 ,0表示一条都没有,?表示这种边没有限制,那么容斥可以得到的是 : f[111] = f[???] - (f[0??]+f[?0?]+f[??0]) + (f[00?]+f[0?0]+f[?00]) - f[000]
证明可以通过二项式系数的关系导出,并且可以推广到N维形式。
显然等号右边的每个f[]都是比较好求的(但是会涉及很多算法),不过注意一些f[]是恒等的(根据图的对称性可得),所以不用每个f[]都去写一个函数算。算等号右边的f[]贡献了本题的大部分码量,这里就不一个一个说了,相信你们都能想出来的hhhhh
最后注意一下f[000],当且仅当 m==0 时 f[000]=2^n;否则 f[000]=0。
我一开始就因为这个WA了,想当然以为不可能每种边都没有(I'm reall a bro in bro),即 f[000]=0.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1200005; int n,m,v[55],p[55],M,f[N];
bool g[55][55];
ll ans,all; inline bool Can(int S,int ad){
for(int i=0;i<M;i++)
for(int j=i+1;j<M;j++) if(g[i+ad][j+ad]&&((1<<i)&S)&&((1<<j)&S)) return 0;
return 1;
} inline void Get1(){
for(int s=0;s<(1<<M);s++) if(Can(s,0)) f[s]++;
} inline void maintain(){
for(int i=0;i<M;i++)
for(int j=0;j<(1<<M);j++) if(!((1<<i)&j)) f[j|(1<<i)]+=f[j];
} inline ll Get2(){
ll an=0;
for(int s=0,now,al=(1<<M)-1;s<(1<<(n-M));s++) if(Can(s,M)){
now=0;
for(int i=M;i<n;i++) if((1<<(i-M))&s)
for(int j=0;j<M;j++) if(g[i][j]) now|=1<<j;
an+=f[al^now];
}
return an;
} inline ll solve1(){
/* meet in the middle:
一半: 枚举合法二进制并用FMT的处理(类似高维每维值域{0,1}的前缀和)
映射到所有包含它的二进制上 另一半: 枚举合法二进制,直接找FMT数组对应的位置加就OK了
*/
Get1();
maintain();
return Get2();
} int getfa(int x){ return p[x]==x?x:(p[x]=getfa(p[x]));} inline ll solve2(){
ll an=1;
for(int i=0;i<n;i++) p[i]=i; for(int i=0,fa,fb;i<n;i++)
for(int j=i+1;j<n;j++) if(g[i][j]){
fa=getfa(i),fb=getfa(j);
if(fa!=fb) p[fa]=fb;
} for(int i=0;i<n;i++) if(v[getfa(i)]!=2) v[p[i]]=2,an<<=1; return an;
} inline ll solve3(){
ll an=1; for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++) if(g[i][j]) v[i]=v[j]=3;
for(int i=0;i<n;i++) if(v[i]!=3) an<<=1; return an;
} bool color(int x,int c){
v[x]=c;
for(int i=0;i<n;i++) if(g[x][i])
if(v[i]==v[x]) return 0;
else if(v[i]<4&&!color(i,9-c)) return 0;
return 1;
} inline ll solve4(){
ll an=1; for(int i=0;i<n;i++) if(v[i]<4)
if(!color(i,4)) return 0; else an<<=1; return an;
} int main(){
scanf("%d%d",&n,&m),all=(1ll<<n)-1,M=n+1>>1;
if(!m) ans-=all+1;//000 type
for(int U,V;m;m--)
scanf("%d%d",&U,&V),U--,V--,g[V][U]=g[U][V]=1; ans+=all+1;// ??? type
ans-=2*solve1();// 0?? and ??0 type , cause its symmetry , we can simply double the ans
ans-=solve2();// ?0? type
ans+=2*solve3();// ?00 and 00? type , similar to solve1()
ans+=solve4();//0?0 type cout<<ans<<endl;
return 0;
}
Codeforces 1221 G Graph And Numbers的更多相关文章
- [codeforces 549]G. Happy Line
[codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- CodeForces 794 G.Replace All
CodeForces 794 G.Replace All 解题思路 首先如果字符串 \(A, B\) 没有匹配,那么二元组 \((S, T)\) 合法的一个必要条件是存在正整数对 \((x,y)\), ...
- Codeforces 1207 G. Indie Album
Codeforces 1207 G. Indie Album 解题思路 离线下来用SAM或者AC自动机就是一个单点加子树求和,套个树状数组就好了,因为这个题广义SAM不能存在 \(len[u] = l ...
- Codeforces 385C Bear and Prime Numbers(素数预处理)
Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...
- codeforces gym100801 Problem G. Graph
传送门:https://codeforces.com/gym/100801 题意: 给你一个DAG图,你最多可以进行k次操作,每次操作可以连一条有向边,问你经过连边操作后最小拓扑序的最大值是多少 题解 ...
- Codeforces 1082 G - Petya and Graph
G - Petya and Graph 思路: 最大权闭合子图 对于每条边,如果它选了,那么它连的的两个点也要选 边权为正,点权为负,那么就是求最大权闭合子图 代码: #pragma GCC opti ...
- @codeforces - 1221G@ Graph And Numbers
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 点 m 边的无向图. 现在要求给每个点写上 0 或 ...
随机推荐
- java. util. concurrent. atomic
一.原子更新基本类型 AtomicInteger AtomicBoolean AtomicLong 二.原子更新数组 AtomicIntegerArray AtomicLongArray Atomic ...
- 『Python基础』第4节:基础数据类型初识
本节只是对基础数据类型做个简单介绍, 详情会在之后慢慢介绍 什么是数据类型? 我们人类可以分清数字与字符串的区别, 可是计算机不能. 虽然计算机很强大, 但在某种程度上又很傻, 除非你明确告诉它数字与 ...
- shell习题第24题:杀进程
[题目要求] 一台机器负载高,top查看到有很多sh的进程,然后top -c查看可以看到对应的进程命令是sh -c /bin/clear.sh 经分析后发现是因为该脚本执行时间太长,导致后续执行时,上 ...
- Python操作Redis(转)
原文1:https://cloud.tencent.com/developer/article/1151834 原文2:https://www.cnblogs.com/zhaohuhu/p/91406 ...
- 音视频入门-02-RGB拼图
* 音视频入门文章目录 * 图片 & 像素点 & RGB 平时浏览的图片看不出像素点: 图片放大时,可以看出图片是一个个像素点组成的: 每个像素点的颜色可以用 RGB 表示: RGB ...
- EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
在多工程项目中,由于EF封装在某一个工程里,那么该项目用于EF相关类库 EntityFramework.dll,以及EntityFramework.SqlServer.dll的引用 那么你一个启动工程 ...
- Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】
此题可以用STL中的map做,但是了解一下Trie树这个数据结构也是必须的. Trie树(又称字典树)有以下特点: 根节点不包含字符,除它之外的每一个节点都包含一个字符. 从根节点到某一节点,路径上经 ...
- VBA宏注释(四)
注释用于记录程序逻辑和用户信息,其他程序员将来可以阅读并理解相同的代码无缝工作. 它包括由开发者,修改者以及还可以包括合并逻辑的信息. 解释器在执行时忽略注释. VBA中的注释用两种方法表示,它们分别 ...
- keras 切换后端 TensorFlow,cntk,theano
参考 https://keras.io/#configuring-your-keras-backend https://keras.io/backend/ Switching from one bac ...
- Linux环境下Redis安装和常见问题的解决
Redis是一款非常非常非常好用的缓存数据库,在保存需要定期更新的Token值,或者在保证高并发安全可靠性的场景下,基本上说是必用了. 安装过好多次Redis了,也用过阿里云Redis数据库,但是每次 ...