当前位置: 首页 > news >正文

信友队 统计环(状压DP+钦定优化)

信友队 统计环

时间限制:6000ms / 空间限制:512MB

输入输出:cycle.in/cycle.out

这题是Codeforces 11D的强化版。没有信友队题库的可以把这道题的代码交到CF上。

题目简述

给定一张 $N$ 个节点,$M$ 条边的图,图中不含自环,但可以含重边。你需要统计简单环的数量,输出答案对998244353取余的结果。

对,题目就这么简单。

数据范围:

  • $2 \le N \le 20$
  • $2 \le M \le 2 \times 10^5$
  • $1 \le U_i < V_i \le N$
  • 所有输入值皆为整数。(当然这句是废话)
  • Subtask 1(30 pts):$N \le 10$
  • Subtask 2(20 pts):$N \le 18$
  • Subtask 2(50 pts):$N \le 20$

大样例(24520.zip)

思路

50pts

我们发现 $N$ 很小,我们考虑直接状压DP。环是比较难维护的,所以我们考虑维护一条链。$dp_{S,i,j}$ 中,$S$ 表示我们现在选了多少个点,$i$、$j$ 表示这条链的两端分别是 $i$ 和 $j$。$dp_{S,i,j}$ 表示现在这个情况下有多少条符合条件的链。对于每个状态,我们可以转移:

首先左边转移:

$$dp_{S | (1 << k), k, j} \leftarrow dp_{S, i, j} \sdot cnt_{i, k}$$

同理右边转移:

$$dp_{S | (1 << k), i, k} \leftarrow dp_{S, i, j} \sdot cnt_{j, k}$$

之后我们就可以 $O(2^N \sdot N^3)$ 得做完这题的 50 分了。时间限制很宽,足足 6s。

100pts

我们通过上面的DP方程式,感觉向两边拓展还是太吃操作了,有没有简单又实用的方法呢?

有的兄弟,用的!

我们考虑钦定左端点为环上编号最大的一个点,即 $\lfloor \log_2 S \rfloor$。这样我们止血药考虑右端点的转移了。新的DP状态为 $dp_{S, i}$,表示含有 $S$ 的节点,右端点为 $i$ 所有符合条件的可行的数量。

$$dp_{S | (1 << k), k} \leftarrow dp_{S, i} \sdot cnt_{i, k}$$

最后统计答案,就是把符合条件的链找一下左端点和右端点,乘上连接两个点的边的数量,即:

$$ans \leftarrow dp_{S, i} * cnt_{\lfloor \log_2 S \rfloor, i}$$

最后不要忘了模除998244353

Code:

/*@ Author:       Eric / Sky__White@ Filename:     统计环.cpp@ Date:         15/07/2026@ Email:        acwing@foxmail.com / 17802535158@163.com
*/#include <cstring>
#include <iostream>
#include <functional>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <queue>
#include <ctime>namespace std {class Read {public:template<typename T>inline Read operator >> (T & x) {T sum = 0, opt = 1;char ch = getchar();while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();x = sum * opt; return *this;}};
}
#define int long long
#define all(a) a.begin(), a.end()using namespace std; Read fin;const int Mod = 998244353;signed main() {freopen("circle.in", "r", stdin);freopen("circle.out", "w", stdout);int n, m; fin >> n >> m;auto cl = clock();vector<vector<int> > G(n + 1);vector<vector<int> > cnt(n + 1, vector<int>(n + 1));for (int i = 1; i <= m; i ++ ) {int u, v; fin >> u >> v;G[u].push_back(v);G[v].push_back(u);cnt[u][v] ++ , cnt[v][u] ++ ;}vector<vector<int> > dp(1 << n, vector<int>(n + 1));for (int i = 1; i <= n; i ++ )dp[1 << i - 1][i] = 1;for (int S = 1; S < 1 << n; S ++ ) {int rt = log2(S) + 1.000000003;for (int u = 1; u <= rt; u ++ ) {if (S & (1 << u - 1)) for (int v = 1; v <= rt; v ++ )if (~S & (1 << v - 1)) {(dp[S | (1 << v - 1)][v] += dp[S][u] * cnt[u][v]) %= Mod;}}}int ans = 0;function<int(int)> lowbit = [&](int x) -> int {return x & -x;};for (int S = 1; S < 1 << n; S ++ ) {int rt = log2(S) + 1.000000003;if (S - lowbit(S) == 0) continue;for (int u = 1; u <= rt; u ++ ) {int &v = rt;if (u == v) continue;if (~S & (1 << u - 1)) continue;(ans += dp[S][u] * cnt[u][v]) %= Mod;}}ans = (ans - m + Mod) % Mod;(ans *= 499122177) %= Mod;while((clock() * 1.0 - cl) / CLOCKS_PER_SEC < 5.99) ; // 卡评测机 xixicout << ans << endl;
}
http://www.jsqmd.com/news/1269915/

相关文章:

  • MediaPlugin常见问题解答:解决90%开发者遇到的技术难题
  • 免费开源眼动追踪:如何用计算机视觉技术实现精准视线控制
  • CiviCRM数据库架构深度解析:核心表结构与关系模型
  • Window Resizer:Windows窗口大小强制调整工具的终极指南
  • 2026 自媒体专用好用的 AI 修图平台推荐,海报封面快速美化,ImageGood 创作者必备工具 - GrowthUME
  • kubevirt - 心识
  • DSOD300 vs 传统检测器:为什么深度监督结构让从 scratch 训练成为可能?
  • 2026寄件省钱全攻略:快递社领衔妈妈寄大件 - 快递物流实时资讯
  • 如何用gh_mirrors/dsa/DSA提升C开发效率:10个必备数据结构详解
  • KTV 里高音飙不上去,想提前练练升 Key?2026 免费音频变调工具,随便升降几个半音,人声依然自然不假。 - 今日咨询
  • 一键备份你的QQ空间:GetQzonehistory开源工具完全指南
  • C++游戏开发全流程:从架构设计到性能优化的工程实践
  • 深圳龙华区搬家公司口碑推荐榜:深圳北高铁通勤圈、红山民治新兴住宅、观澜大浪片区服务能力与评价解析 - 厚道搬家
  • 如何用developer-portfolio快速创建专业作品集?10分钟完成个人品牌展示网站
  • java学习五
  • 解决Windows游戏DirectX报错全攻略
  • 从命令行到API:tsc-watch的多场景应用案例
  • nginx - 心识
  • DenseNet-BC架构详解:如何用更少参数实现CIFAR-10最佳精度3.46%
  • Kubernetes StorageClass配置与CKA认证实战指南
  • MiniMax Hub:本地AI创意工作流集成开发环境深度解析
  • Linux文件IO原理与高性能编程实践
  • 【信息科学与工程学】【通信工程】第七十三篇 分组网络中服务质量保障的算法 20
  • AI模型数学题测试必须绕开的5个认知陷阱,第3个连OpenAI内部文档都未披露
  • 寄件避坑省钱:两款微信工具就够了 - 快递物流实时资讯
  • 【Bug已解决】[Bug]: fastapi error ‘_IncludedRouter‘ object has no attribute ‘path‘ 解决方案
  • # 安卓转 iPhone 语音总转圈?2026 免费 M4A 转换工具合集,一键适配苹果原生格式 - 今日咨询
  • 2026年7月全新海尔燃气灶售后服务电话24小时400人工热线全面正式启用公告 - 全国网点服务中心
  • FastFormers入门指南:从安装到运行SuperGLUE基准测试的完整教程
  • HarmonyOS应用《玄象》开发实战:神煞查法:天乙贵人 / 文昌 / 桃花查表算法封装