至今觉得这场 edu 的 G 比 EF 都要简单……

不知道为什么出题人要把 \(m=0\) 放进去,先特判掉。

要求至少一个 \(0\),至少一个 \(1\),至少一个 \(2\),容斥一波,变成总方案数-没有 \(0\)-没有 \(1\)-没有 \(2\)+没有 \(01\)+没有 \(02\)+没有 \(12\)+没有 \(012\)。

没有 \(0\) 和没有 \(2\) 比较难搞,放到最后讨论。

没有 \(1\),考虑一个联通块,这个联通块所有数都一样,方案数是 \(2^{cnt}\),其中 \(cnt\) 是联通块个数。

没有 \(01\),也就是只有 \(2\),如果一个联通块中没有边(单独一个点),那么当然可以随便放,否则这个联通块所有数都是 \(1\)。方案数 \(2^{cnt2}\),其中 \(cnt2\) 是单独一个点的联通块个数。

没有 \(02\),也就是只有 \(1\),等价于将这个图黑白染色的方案数。如果可以黑白染色,那么方案数是 \(2^{cnt}\),否则是 \(0\)。

没有 \(12\),和没有 \(01\) 一样。方案数是 \(2^{cnt2}\)。

没有 \(012\),因为 \(m\ne 0\),显然不可能。方案数为 \(0\)。

接下来就考虑没有 \(0\) 的方案数(没有 \(2\) 是一样的)。

这个数据范围很明显是让我们折半搜索。我们不妨先搜后半部分。

对于每个合法的后半部分(即没有两个是 \(0\) 的点相邻),前半部分有哪些点不能是 \(0\) 我们是知道的。

转变一下,变成当前半部分选取的 \(0\) 点集合为 \(S\) 时,后半部分有多少种方案 \(val_S\)。(我是这么写的)

满足条件的 \(S\) 就是不能选的点的补集的子集。

实际上,在补集的 \(val\) 加个 \(1\),搜完后再做高维后缀和就能得到真的 \(val_S\)。应该不难理解。

然后再搜前半部分,对每个合法方案都加上它的 \(val\) 就行了。

时间复杂度,如果前半部分有 \(T\) 个点,复杂度是 \(O(2^TT+2^{n-T})\)。

由于我比较懒,我就取了 \(T=\frac{n}{2}\)。实际上要是 \(T\) 控制得够好,应该可以跑过 \(n=50\)。(取 \(T=23\),大概是 3e8,3.5s+CF 神机应该没问题)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=1048576;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=0,f=0;
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,cnt,cnt2,bar,lim;
ll e[40],ans,val[maxn];
bool ind[40],vis[40],col[40],flag=true;
void dfs(int u){
vis[u]=true;
FOR(v,0,n-1) if((e[u]>>v)&1){
if(!vis[v]) col[v]=col[u]^1,dfs(v);
else{
if(col[v]!=(col[u]^1)) flag=false;
}
}
}
void dfs1(int dep,ll st,ll used){
if(dep==bar) return void(val[(~st)&(lim-1)]++);
dfs1(dep-1,st,used);
if(!((st>>dep)&1)) dfs1(dep-1,st|e[dep],used|1<<dep);
}
void dfs2(int dep,ll st,ll used){
if(dep==bar+1) return void(ans-=2*val[used&(lim-1)]);
dfs2(dep+1,st,used);
if(!((st>>dep)&1)) dfs2(dep+1,st|e[dep],used|1<<dep);
}
int main(){
n=read();m=read();
if(!m) return puts("0"),0;
FOR(i,0,n-1) ind[i]=true;
FOR(i,1,m){
int u=read()-1,v=read()-1;
e[u]|=1ll<<v;e[v]|=1ll<<u;
ind[u]=ind[v]=false;
}
FOR(i,0,n-1) if(ind[i]) cnt2++;
FOR(i,0,n-1) if(!vis[i]) cnt++,dfs(i);
ans=(1ll<<n)-(1ll<<cnt)+(1ll<<cnt2)+(1ll<<cnt2)+(flag?1ll<<cnt:0);
bar=(n-1)/2;lim=1<<(bar+1);
dfs1(n-1,0,0);
for(int i=1;i<lim;i<<=1)
for(int j=0;j<lim;j+=i<<1)
FOR(k,0,i-1) val[j+k]+=val[i+j+k];
dfs2(0,0,0);
printf("%lld\n",ans);
}

CF1221G Graph And Number(容斥,搜索,FMT)的更多相关文章

  1. XTU 1242 Yada Number 容斥

    Yada Number Problem Description: Every positive integer can be expressed by multiplication of prime ...

  2. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

  3. bzoj 1853 容斥 + 搜索

    思路:先把所有幸运数字找出来, 把没有用的去掉,然后爆搜容斥,因为最多只会搜十几个就超过限制了, 所以是可行的. #include<bits/stdc++.h> #define LL lo ...

  4. 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)

    传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...

  5. 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)

    [LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...

  6. [HAOI2015]按位或(min-max容斥,FWT,FMT)

    题目链接:洛谷 题目大意:给定正整数 $n$.一开始有一个数字 $0$,然后每一秒,都有 $p_i$ 的概率获得 $i$ 这个数 $(0\le i< 2^n)$.一秒恰好会获得一个数.每获得一个 ...

  7. 【BZOJ1853】幸运数字(搜索,容斥)

    [BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...

  8. bzoj 4036 按位或 —— min-max容斥+FMT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 min-max容斥:https://blog.csdn.net/ez_2016gdgz ...

  9. HDU - 4059: The Boss on Mars (容斥 拉格朗日 小小的优化搜索)

    pro: T次询问,每次给出N(N<1e8),求所有Σi^4 (i<=N,且gcd(i,N)==1) ; sol:  因为N比较小,我们可以求出素因子,然后容斥.  主要问题就是求1到P的 ...

随机推荐

  1. 请不要嘲笑你身边那些投了P2P的朋友

    在这方面我是非常谨慎的,但依然逃脱不了翻车的命运 这段时间曾经无数大V强烈推荐的懒投资出现大面积逾期,又把这个行业推上了风口浪尖,这里讲一讲我的故事 对于大多数人的理财投资可能是从2013年余额宝的推 ...

  2. OpenFOAM——过渡管中的湍流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL016:Turbulent Flow in a Transition Duct 一 ...

  3. Ubuntu Idea 快捷键 Ctrl+Alt+S 无法使用解决

    Idea 里习惯了用 Ctrl+Alt+S 打开设置界面,在 Ubuntu 下会因为快捷键冲突无法使用 系统快捷键 打开系统设置中的快捷键设置,按 Backspace 键禁用 Fcitx 如果你的输入 ...

  4. IT兄弟连 Java语法教程 逻辑运算符

    表8中显示的布尔逻辑运算符只能操作布尔类型的操作数,所有的二元逻辑运算符都可以组合两个布尔值,得到的结果为布尔类型. 表8  布尔逻辑运算符 布尔逻辑运算符”&“.”|“以及”^“,都会布尔值 ...

  5. ASP.NET Core使用Nacos作为配置中心的多环境问题

    前言 双11那天离职后,这段时间都待在家里,看看书,写写代码,逛逛招聘网站 周一去Gworld面试的时候,有听到面试官说他们用到了配置中心Apollo,聊下来,听他的意思,大概是处理了多环境这个比较方 ...

  6. Spring核心(IoC) 入门解读

    什么是IoC容器和Bean? 说到容器,就是用来装东西,那么这里边装的是什么那?是bean对象.那么你会问什么是bean?这就要从很久很久以前说起,当我们创建对象的时候,我们会new一个对象出来,但是 ...

  7. 屏幕输入转换为int//方法大注释

    可以使用两种方法: using System; namespace 方法测试 { class Program { static void Main(string[] args) { Console.W ...

  8. .NET MVC5简介(六)HttpHandler

    浏览器到网站程序 上一篇中,介绍IHttpModule的时候,自定义一个类CustomHttpModule继承自IHttpModule,自定义一个事件,并配合配置文件,就可以执行自定义Module中的 ...

  9. Docker开启Remote API 访问 2375端口

    Docker常见端口 我看到的常见docker端口包括: 2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为h ...

  10. Web前端基础(2):HTML(二)

    1. body中的相关标签 1.1 标题标签:hn HTML提供<hn>系列标签,用于修饰标签,包含:<h1>.<h2>.<h3>.<h4> ...