尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

做题记录 #5

做题记录 #5
📅 发布时间:2026/6/18 23:47:11

A. CF2135E1 Beyond the Palindrome (Easy Version) (7.5)

2025.11.10

容斥好题。首先发现这个消除 10 子串类似一个括号序列,最后只会剩下 前缀一堆 \(0\) 和 后缀一堆 \(1\)。经典 trick 转 \(\pm 1\) 前缀和折线,令 \(0\) 时 \(-1\)、\(1\) 时 \(+1\),那么不难发现前面 \(0\) 的个数是 \(-\min pre\) 个。反转后的前缀和折线,可以发现刚好是原折线绕 \((n,pre_n)\) 旋转 \(180^\circ\),因此不难得到 \(\max pre - pre_n = -\min pre\),即 \(\max pre + \min pre = sum\)。非常好的转化。

那么接下来怎么做呢?可以枚举这个折线的值域,即 \(\max=u\) 和 \(\min=d\)。此时非常想要反射容斥,但是这个条件是“恰好”的,不好处理,考虑容斥成 \((d, u) - (d + 1, u) - (d, u - 1) + (d + 1, u - 1)\),就可以改成 \(\max \leq u, \min \geq d\) 了。

于是考虑反射容斥。与 Catalan 的反射容斥不太相同,它有两条线卡着。但是反思反射容斥的过程,我做一次反射可以容斥完所有的只触碰当前 \(y=i\) 这个限制直线 的方案,所以连续的触碰同一个限制是无需考虑的,我只需要考虑交替的触碰。当然,会有两种交替的方式(向上或向下)。由于 \(x=n\) 的情况下无法走到 \(|y| > n\) 的点位,而且每两次反射都会增长 \(2(u-d)\) 的纵坐标绝对值,因此做一个 \((d,u)\) 的复杂度是 \(\mathcal{O}(\frac{n}{u-d})\) 的。暴力枚举 \(n^2\ln n\)。

发现我有很多的 \(u-d\) 相同,他们考虑的反射其实是类似的,我们可以直接把它连起点平移到 \((0, u-d)\) 的限制中。此时,起点是 \((0, 0\sim u-d)\),对应的终点是 \((n, u-d\sim 0)\)。不难发现我做的翻折不会给点横坐标带上系数,因此每个起点对应的终点横坐标一定也是段区间。此时存在两种情况,一种差值全相等,组合数直接乘起点数即可;另一种差值是个公差为 \(2\) 的等差数列,考虑到 \((0, 0)\rightarrow (n, x)\) 的方案数其实是 \(n\choose (n+x)/2\),因此是个组合数区间和,总数都是 \(n\),预处理一下前缀和即可。时间复杂度 \(\mathcal{O}(n\ln n)\)。

代码细节挺多,因为会有上面容斥的 减去项,需要深思熟虑。今天状态有点差,想不明白这个 E2,看题解也没有很懂,但是感觉是特殊化的推式子,感觉不太 educational,故没有补/hsh

Code
// STOOOOOOOOOOOOOOOOOOOOOOOOO hzt CCCCCCCCCCCCCCCCCCCCCCCORZ
#include <algorithm>
#include <cassert>
#include <iostream>
#include <numeric>
#include <vector>using namespace std;
using LL = long long;
using PII = pair<int, int>;
constexpr int kN = 1e6 + 1, kP = 998244353;int T, n;
int inv[kN], a[kN];
LL sum[kN];
LL Get(int l, int r) {l > r && (swap(l, r), 0);return sum[min(r, n)] - (l > 0 ? sum[l - 1] : 0);
}
int Func(int d, bool o) {LL ret = 0, len = d + 2 - o;for (int k = 0, l; (l = (n + d - o) / 2 - k * len) >= 0; k++)  //* UDret += Get((n - d) / 2 - k * len, l);for (int k = 1, r; (r = (n - d) / 2 + k * len) <= n; k++)  //* DUret += Get(r, (n + d) / 2 - o + k * len);for (int k = 0, p; (p = (n - d) / 2 - 1 - k * len) >= 0; k++)  //* Dret -= (d + 1ll - o) * a[p] % kP;for (int k = 1, p; (p = (n - d) / 2 - 1 + k * len) <= n; k++)  //* Uret -= (d + 1ll - o) * a[p] % kP;return (ret % kP + kP) % kP;
}
int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("output.out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);inv[1] = 1;for (int i = 2; i < kN; i++)inv[i] = 1ll * (kP - kP / i) * inv[kP % i] % kP;for (cin >> T; T--;) {cin >> n, sum[0] = a[0] = 1;for (int i = 1; i <= n; i++) {a[i] = 1ll * a[i - 1] * inv[i] % kP * (n - i + 1) % kP;sum[i] = (sum[i - 1] + a[i]) % kP;}LL ans = 0;for (int d = 2 - (n % 2), lst = 0; d <= n; d += 2) {ans += lst;ans += (lst = Func(d, 0));ans -= 2 * Func(d, 1);}cout << (ans % kP + kP) % kP << '\n';for (int i = 0; i <= n; i++)sum[i] = a[i] = 0;}return 0;
}

相关新闻

  • 降AI总踩坑?关键看这3点选对工具
  • AI降重避坑指南:如何有效降低论文AI检测率?
  • PyTorch - whats the difference between models training mode and evaluation mode?

最新新闻

  • AI中转站成本真相:36倍价差背后的渠道经济学
  • 通达信缠论插件:让复杂的技术分析变得简单直观
  • 如何在5分钟内免费搭建你的AI桌面助手:开源协作工具的终极指南
  • Mermaid Live Editor:5分钟掌握免费在线图表绘制的终极指南
  • MSC8144AMC-S多DSP板卡硬件设计:以太网、TDM与RapidIO接口深度解析
  • 超大质量双黑洞系统:数值模拟与观测特征

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号