[ABC213G] Connectivity 2 题解
T3 [ABC213G] Connectivity 2
题意:给定一张无向图
比较套路的一道状压 DP。尽管刚开始思考毫无头绪。
Step 1.
令
这部分复杂度是
Step 2.
计算
这部分的复杂度是
Step 3.
计算
后面这部分又是一个很套路的计算方法:钦定一个点
这部分需要枚举子集的子集,复杂度
综上,总复杂度为
坑点:
- 时刻注意状压的意义是从左到右还是从右到左。事实上,这道题与平常的状压不同,从左到右会方便很多。
- 在计算答案时所需要的
只需要包含 的点集,所以在计算 时只需要枚举 的情况。所以我们上述的 “钦定一个点 ” 也可直接钦定 。
#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
#define int long long
using namespace std;
char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
}
template<typename T>
void write(T x,char sf='\n'){
if(x<0)putchar('-'),x=~x+1;
int top=0;
do str[top++]=x%10,x/=10;while(x);
while(top)putchar(str[--top]+48);
if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MOD=998244353;
int n,m;
int f[(1<<17)+5],g[(1<<17)+5];
int e[18][18];
int fac[17*17+5]={1};
void add(int&x,int y){
x=x+y>=MOD?x+y-MOD:x+y;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n*n;++i)fac[i]=fac[i-1]*2%MOD;
for(int i=1,u,v;i<=m;++i){
u=read(),v=read();
e[u][v]=e[v][u]=1;
}
for(int s=0,cnt;s<1<<n;++s){
cnt=0;
for(int i=1;i<=n;++i)
if(s&(1<<(i-1)))
for(int j=i+1;j<=n;++j)
if(s&(1<<(j-1))&&e[n-i+1][n-j+1])
++cnt;
add(g[s],fac[cnt]);
}
for(int s=1<<(n-1),tmp;s<1<<n;++s){
tmp=0;
for(int t=s;t>=1<<(n-1);t=(t-1)&s)
if(t^s&&t&(1<<(n-1)))
add(tmp,(ll)f[t]*g[s^t]%MOD);
f[s]=(g[s]-tmp+MOD)%MOD;
}
for(int i=2,ans;i<=n;++i){
ans=0;
for(int s=1<<(n-1);s<1<<n;++s)
if(s&(1<<(n-i)))
add(ans,(ll)f[s]*g[((1<<n)-1)^s]%MOD);
write(ans);
}
return fw,0;
}
即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立。略去过程 ,由上可知证毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通