题解OIer们好!这道题要求我们计算一个包含组合数和分数的复杂求和式:
S(n) = \sum\\\_{k=0}^{n} \binom{n}{k} \frac{2^k}{k+1}并且要求结果对 $998244353$ 取模。
如果直接按照公式一步步算,不仅会超时,还会遇到一个巨大的麻烦:在取模的世界里,分数怎么算?
别担心,这篇题解会带你从零开始,先搞懂”分数取模”这个魔法,然后再用两种不同的方法(微积分法和纯代数法)把复杂的式子化简,最后轻松写出代码!
第一部分:前置知识——分数取模(模意义下的除法)在普通的数学里,$6 \div 2 = 3$。但是在取模(比如模 $7$)的世界里,我们只关心余数,没有小数。那 $6 \div 2 \pmod 7$ 怎么算呢?
1. 把”除法”变成”乘法”在普通数学中,除以一个数,等于乘以它的倒数。比如 $6 \div 2 = 6 \times \frac{1}{2}$。在取模的世界里,我们也找一个”倒数”,我们叫它 “乘法逆元”。假设我们要算 $A \div B \pmod p$,我们可以把它变成 $A \times B^{-1} \pmod ...
👋 你好!我是 lyx919,一名正在信息学竞赛路上摸爬滚打的初中生。
🏆 关于 OI我热爱算法与数据结构,喜欢在代码的世界里寻找优雅的解法。主要研究方向包括:
组合数学:Catalan 数、排列统计、计数问题
数据结构:全局平衡二叉树、线段树、扫描线
竞赛题解:NOIP、POI 等比赛的题目分析与解法
📝 博客内容这个博客会分享我在 OI 学习过程中的:
✅ 算法学习笔记与知识总结
✅ 竞赛题目的详细题解
✅ 数学证明与推导过程
✅ 一些开发相关的杂谈
🔗 更多地方
平台
链接
CSDN
liu20120919
GitHub
lyx919777
💬 座右铭
路虽远,行则将至;事虽难,做则必成。
很高兴在这里遇见你,欢迎交流 💪
摘要本文研究了排列中逆序对数与位置偏差和的等价关系。设 $S\\n$ 为 $1\sim n$ 的所有排列的集合,对任意排列 $p\in S\_n$,定义 $f(p)$ 为 $p$ 中逆序对 $(i,j)$(满足 $ip\_j$)的个数,定义 $g(p)=\frac{1}{2}\sum\\{i=1}^n |i-p\_i|$。本文证明了所有满足 $f(p)=g(p)$ 的排列个数恰好为第 $n$ 项 Catalan 数 $C\_n$。该结果揭示了排列的逆序结构与位置偏移之间的深层联系,同时建立了 321-avoiding 排列的一个新特征。
关键词:排列;逆序对;位置偏差;321-avoiding 排列;Catalan 数
1. 引言排列的统计性质是组合数学中的经典研究方向。在众多统计参数中,逆序数和 major index 是最基础也最重要的两个参数。MacMahon 在 1914 年首次发现它们具有相同的分布[10],这一结果被 Foata 和 Schützenberger 通过组合证明[7],并被广泛应用于组合分析。
本文研究的问题涉及两个新定义的统计参数:
逆序对数 $f ...
摘要本文证明了全局平衡二叉树在最坏情况下(两条重链平分节点数)的时间复杂度仍为 $O(\log n)$。通过数学推导,当两条重链节点数均为 $n/2$ 时,树高达到最大值 $2\log\\_2 n - 2$,与理想高度 $\log\\_2 n$ 的差值仅为常数项。这表明即使在最劣情况下,全局平衡二叉树的树高仍保持对数级别,验证了其 $O(\log n)$ 的时间复杂度。该证明解决了关于全局平衡二叉树复杂度的关键问题,为相关算法分析提供了理论依据。
1. 引言全局平衡二叉树是一种基于树链剖分的数据结构,常用于优化树上路径查询问题。与传统的轻重链剖分相比,全局平衡二叉树在理论上具有更优秀的常数,但在实际应用中,关于其最坏情况时间复杂度的严格证明一直缺乏系统性的讨论。
本文的核心目标是给出全局平衡二叉树在最坏情况下时间复杂度的完整数学证明。
2. 树链剖分与全局平衡二叉树2.1 轻重链剖分给定一棵有根树,对于每个节点 $u$:
重儿子:$u$ 的所有子节点中子树最大的那个
轻儿子:$u$ 的其他子节点
重链:由重儿子连接而成的链
性质:从根到任意叶子的路径上,轻边数量不超过 $\log\ ...
问题描述给定一个 $n \times m$ 的网格,初始时所有格子均为白色。现有 $q$ 次操作,每次操作为以下两种之一:
横线染色:将第 $x$ 行中,第 $l$ 列到第 $r$ 列之间的所有格子染为黑色
竖线染色:将第 $y$ 列中,第 $u$ 行到第 $d$ 行之间的所有格子染为黑色
最终需要求出被染成黑色的格子总数。
特殊性质 B:仅存在横线和竖线两种操作,不存在矩形区域染色。
问题分析由于只有横线和竖线,一个格子 $(i,j)$ 被染黑当且仅当它至少被一条横线或一条竖线覆盖。
直接暴力模拟的时间复杂度为 $O(n \times m)$,无法接受。我们需要更高效的方法。
核心思路考虑容斥原理:
最终黑色格子数 $=$ 被横线覆盖的格子数 $+$ 被竖线覆盖的格子数 $-$ 同时被横线和竖线覆盖的格子数
即:
Ans = |H| + |V| - |H \cap V|其中 $H$ 为横线覆盖的集合,$V$ 为竖线覆盖的集合。
关键难点在于计算 $|H \cap V|$——即横线和竖线交叉点的数量。
算法设计1. 贯穿线段处理对于贯穿整个网格的线段(即从边界到边界),可以直接用公 ...
题目描述给定一个特殊的 DAG(有向无环图),求图中的最长路径长度。
该图的特殊性质是:每个节点的可达节点集合有一个特殊的约束——每个节点最多有 $k$ 个”关键依赖”,其中 $k \leq 8$。
问题分析初步尝试1. 常规 DP对于一般的 DAG,最长路径可以通过拓扑排序 + DP 求解:
dp[v] = \max\\\\_{(u \to v)} (dp[u] + 1)但在此题中,边数可能非常多,直接建图会导致状态爆炸。
2. 拓扑排序由于节点之间的约束关系复杂,拓扑排序需要先构建完整的图,这在节点数较多时不可行。
关键观察注意到 $k \leq 8$ 是一个非常小的数,可以使用状态压缩来优化:
每个节点只有 $k$ 个关键前置节点
我们可以将这 $k$ 个关键前置节点的状态压缩为一个二进制数
通过状压 DP 来求解最长路径
状压 DP 解法状态定义设 $dp[u][mask]$ 表示到达节点 $u$,且 $u$ 的 $k$ 个关键前置节点的访问状态为 $mask$ 时的最长路径长度。
其中 $mask$ 的第 $i$ 位表示第 $i$ 个关键前置节点是否已经被访问过。
转移方 ...
题目描述给定一棵 $n$ 个节点的有根树,根为 $1$。你需要为每个节点 $u$ 赋予一个非负整数权值 $w\_u$,使得所有节点的权值构成一个 $0 \sim n-1$ 的排列(即每个数恰好出现一次)。
定义一棵子树的价值为该子树内所有节点权值的 mex(即不在该子树中出现的最小非负整数)。
整棵树的价值定义为所有子树价值之和。
最大化整棵树的价值。
问题分析暴力思路对于 $n \leq 7$ 的数据,可以直接枚举所有排列,计算每种排列的价值,取最大值。
但在 $n$ 较大时,搜索空间太大,必须寻找更优的解法。
关键观察通过暴力枚举和分析小规模数据,我们可以发现以下规律:
主链节点(从根到某个叶子的路径上的节点)应该获得连续的数值
分支节点(不在主链上的节点)应该赋予较小的值,以帮助主链节点获得更大的 mex
贪心策略考虑最优解的结构:
选取一条从根到叶子的路径作为主链
主链上的节点按深度递增获得连续递增的权值(例如 $0,1,2,\dots$)
不在主链上的节点,用它们来”填充”主链节点的子树,使得主链节点的 mex 尽可能大
动态规划解法状态定义设 $f(u, l)$ ...
OI 杂谈
未读目前有很多人吐槽CCF的骚年机,不过,这一次是Intel Core Ultra 9 285K(3800RMB),24年第四季度的游戏旗舰级CPU(台式机,不兼容笔记本),比各位家里的电脑强了不知多少倍(我是14600K,价值2000RMB,单核性能差不多,多核14600K完胜,少了一个NPU和GPU)。
根据现有的信息,Intel Core Ultra 9 285K 是英特尔在2024年第四季度推出的旗舰级台式机处理器。它采用了全新的 Arrow Lake-S 架构,并将NPU(神经网络处理单元)首次引入桌面平台,旨在为用户提供强大的AI计算能力。
下面这个表格汇总了它的核心规格,可以帮大家快速了解:
| 核心规格 | 详细参数| 架构 | Arrow Lake-S| 制程工艺 | CPU Tile采用台积电N3B 3nm工艺| 核心/线程 | 24核24线程 (8个性能核 + 16个能效核)| 最高睿频 | 5.7 GHz(评测机以3.70GHz为准)| 缓存 | 36 MB 三级缓存 + 40 MB 二级缓存| 基础功耗 | 125 W| 最大睿频功耗 | 250 W| 平台AI算 ...
并查集算法简介并查集(Disjoint Set Union,DSU)是一种用于管理元素分组的数据结构,支持两种核心操作:
查找(Find):确定某个元素属于哪个集合(通常返回集合的代表元素)。
合并(Union):将两个集合合并为一个集合。
常用于解决动态连通性问题,如网络连接、图的连通分量计算等。
核心实现方法路径压缩优化(Find)在查找时,将节点的父节点直接指向根节点,缩短后续查找路径。
`int find(int x, vector& parent) { if (parent[x] != x) { parent[x] = find(parent[x], parent); // 路径压缩 } return parent[x];}1234567891011121314151617181920##### 按秩合并(Union)合并时,将较小的树(按秩或大小)合并到较大的树下,避免树过高。`void unionSets(int x, int y, vector<int>& parent, vector<int> ...
NOI_LinuxGeany 编译器使用大全与考场建议
本文档旨在帮助参加 NOI 系列比赛的选手熟练掌握 Linux 环境下 Geany 编译器的使用方法,并提供实战建议以提升考场效率。
🧭 一、Geany 简介Geany 是一款轻量级的图形化代码编辑器,支持多种语言,内置编译运行功能,适用于 NOI Linux 环境下的 C/C++ 编程。
⚙️ 二、基本使用流程
打开 Geany
在桌面或应用菜单中点击 Geany 图标,或使用快捷键 Alt + F2 输入 geany 回车。
新建/打开文件
Ctrl + N 新建文件
Ctrl + O 打开已有文件
保存文件
Ctrl + S 保存当前文件
文件名建议使用英文小写字母,扩展名为 .cpp
编译运行
F8 编译(默认调用 g++)
F5 运行(需编译成功)
编译输出显示在下方“编译”窗口,运行结果显示在“终端”窗口
🛠️ 三、自定义编译命令(推荐)在菜单栏选择 构建 → 设置 → 设置命令,修改如下:
编译命令:`g++ -std=c++17 -O2 -Wall -Wextra -o ...

