[ABC213G] Connectivity 2 题解
[ABC213G] Connectivity 2 题解
套路的经典图上计数题。
考虑枚举和
显然
时间复杂度上瓶颈是枚举
代码:
#include <bits/stdc++.h>
#define N 17
#define int long long
#define mod 998244353
using namespace std;
int n, m;
int mp[N][N];
int f[(1 << N) + 2], g[(1 << N) + 2];
int qpow(int x, int y) {
int ans = 1;
while (y) {
if (y & 1)
ans = ans * x % mod;
x = x * x % mod;
y >>= 1;
}
return ans;
}
int ans[N];
signed main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
--x, --y;
mp[x][y] = mp[y][x] = 1;
}
for (int sta = 0; sta < (1 << n); sta++) {
for (int i = 0; i < n; i++)
if ((sta >> i) & 1)
for (int j = i + 1; j < n; j++)
if (((sta >> j) & 1) && mp[i][j])
g[sta]++;
g[sta] = qpow(2, g[sta]);
}
f[1] = 1;
for (int sta = 3; sta < (1 << n); sta += 2) {
for (int stb = (sta - 1) & sta; stb; stb = (stb - 1) & sta)
f[sta] = (f[sta] + f[stb] * g[sta ^ stb] % mod) % mod;
f[sta] = (g[sta] - f[sta] + mod) % mod;
}
for (int sta = 1; sta < (1 << n); sta++) {
f[sta] = f[sta] * g[((1 << n) - 1) ^ sta] % mod;
for (int i = 0; i < n; i++)
if ((sta >> i) & 1)
ans[i] = (ans[i] + f[sta]) % mod;
}
for (int i = 1; i < n; i++)
cout << ans[i] << "\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】