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

QOJ #8147. Math Exam 题解

Description

求序列 \(a_{1\cdots n}\) 的个数,满足:\(|a_i|\le m\)\(4\sum_{j=1}^i a_j=(a_i+1)^2\)

\(1\le n\le 10^7\)\(1\le m\le 2n\)\(m\) 是奇数。

Solution

首先推一下式子会发现 \(a_1=1\)\(\forall i\geq 2,a_i=a_{i-1}+2\) 或者 \(-a_{i-1}\)

注意到 \(a_i=-a_{i-1}\) 这个东西很难刻画,考虑转成绝对值。

\(b_i=\frac{|a_i+1|}{2}\),则 \(b_{i+1}=b_i\pm 1\),并且 \(0\leq b_i\leq\frac{|m+1|}{2}\)

对于 \(a_i\geq -1\),如果 \(b_{i+1}=b_i+1\),则钦定 \(a_{i+1}=a_i+2\),否则钦定 \(a_{i+1}=-a_i\)

对于 \(a_i<-1\),如果 \(b_{i+1}=b_i+1\),钦定 \(a_{i+1}=-a_i\),否则钦定 \(a_{i+1}=a_i+2\)

经过计算会发现一组值域在 \(\left[0,\frac{|m+1|}{2}\right]\)\(b_1=1\)\(b\) 恰好一一对应一组 \(a\)

然后就转成了有上下界的格路计数问题,用反射容斥做即可。

时间复杂度:\(O(n)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 1e7 + 5, kMod = 998244353;int n, m;
int fac[kMaxN], ifac[kMaxN], s[kMaxN];int qpow(int bs, int64_t idx = kMod - 2) {int ret = 1;for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod)if (idx & 1)ret = (int64_t)ret * bs % kMod;return ret;
}inline int add(int x, int y) { return (x + y >= kMod ? x + y - kMod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + kMod); }
inline void inc(int &x, int y) { (x += y) >= kMod ? x -= kMod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += kMod : x; }int C(int m, int n) {if (m < n || m < 0 || n < 0) return 0;return 1ll * fac[m] * ifac[n] % kMod * ifac[m - n] % kMod;
}void prework(int n = 1e7) {fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % kMod;ifac[n] = qpow(fac[n]);for (int i = n; i; --i) ifac[i - 1] = 1ll * ifac[i] * i % kMod;
}int S(int l, int r) {l = std::max(l, 0), r = std::min(r, n);return l <= r ? sub(s[r], !l ? 0 : s[l - 1]) : 0;
}int calc(int n, int l, int r, int L, int R) {l += n, r += n;if (l % 2 != 0) ++l;if (r % 2 != 0) ++r;l /= 2, r /= 2;int ret = 0;for (int k = -((n + R) / (R - L)); k <= (n + R) / (R - L); ++k) {inc(ret, sub(S(l + k * (R - L), r + k * (R - L)), S(l + k * (R - L) - R, r + k * (R - L) - R)));}return ret;
}void dickdreamer() {std::cin >> n >> m; --n;for (int i = 0; i <= n; ++i) s[i] = add(!i ? 0 : s[i - 1], C(n, i));std::cout << calc(n, -1, (m + 1) / 2 - 1, -2, (m + 1) / 2) << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;prework();while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}
http://www.zskr.cn/news/15254.html

相关文章:

  • 国庆梦熊集训做题记录
  • 兰博平台: 星云抽卡豪华版. 作者acc177
  • AT_abc315_f [ABC315F] Shortcuts
  • 问题表 - microsoft
  • 随想八
  • SolarWinds Web Help Desk远程代码执行漏洞分析
  • Aria2安装
  • 正则表达式学习
  • 神经网络之简单的标量何以表达模型的拟合能力 - 指南
  • 一篇文章入门RabbitMQ:基本概念与Java利用
  • PHP程序员要是基础不扎实,越学越吃力
  • 《电路基础》第七章学习笔记
  • LLM大模型:deepseek sparse attention是个啥?
  • 微信公众号推文添加附件方法,1分钟学会!支持word,excel,pdf等适合招聘,公告,申请表等
  • 2025国庆Day2
  • vue - 实战3 - 后端
  • P11983 [JOIST 2025] 展览会 3 题解
  • 黑客马拉松(Hackathon)
  • 推荐系统中损失函数梳理:从Pointwise到Listwise
  • how to download a websites favicon.ico
  • JQuery CDN recommended
  • 2025 年地坪研磨机公司推荐榜单:盘点 TOP 品牌的格力,宁德时代等标杆客户合作案例
  • istio 部署 - 指南
  • 实用指南:k8s中的schedule
  • 【光照】[PBR][环境光]实现方法解析
  • 树莓派搭建NAS之五:数据同步
  • 深入解析:Coze源码分析-资源库-编辑插件-后端源码-安全与错误处理
  • 详细介绍:【读书笔记】《C陷阱与缺陷》第4章:连接问题解析 | 避开多文件编译的坑
  • 质数表
  • 2025波形护栏厂家 TOP 企业品牌推荐排行榜,山东波形护栏防撞,三波,二波,双波,喷塑,公路,热浸锌,浸塑,镀锌波形护栏公司推荐!