manacher
马拉车算法其实和这个 kmp,z 函数还是有异曲同工之妙的。
我们维护一个最远的回文串边界,记为 r。

1 |
|
可以这样子使用这个差分,得到以该点起点的的这个回文串的数量。
1 | vector<ll> ps = manacher(s); |
manacher
马拉车算法其实和这个 kmp,z 函数还是有异曲同工之妙的。
我们维护一个最远的回文串边界,记为 r。

1 |
|
可以这样子使用这个差分,得到以该点起点的的这个回文串的数量。
1 | vector<ll> ps = manacher(s); |
隔板法的思想就是,把 a 插入 d 个空格当中,换为给 a 加上 d-1 个隔板。

为什么是这个公式呢?不难发现,我们可以把 a 个球和 d-1 个隔板放在一起进行乱排,模拟可以为 0 的情况。

CN+K−1K−1=CN+K−1N 我认为前面一个更容易理解。
要求这个题目要求 xi≥ai,也可以使用这个插板法。

The 21st Hunan Provincial Collegiate Programming Contest——2025-湖南省赛-I. Tearing Paper
这道题目,隔板法是有效的,是因为隔板法其实是要求插入元素的这个顺序是不重要的,那么这道题目,细想之下,确实如此。

经过抽象以后,这道题目需要求解的内容如上。
不难发现,我们其实只关注这个 U R 之间的相对关系,说白了就是两个 U 之间隔了几个 R?只要这个不变,路径是不会改变的。

题目描述
给定一个长度为 n 的正整数序列 a。
求该序列中有多少个连续子段的和为素数。换言之,计算满足 1≤l≤r≤n 且 ∑i=lrai 为素数的数对 (l,r) 的数量。
输入格式
第一行包含一个整数 T(1≤T≤104),表示测试用例的数量。
每个测试用例包含两行:
第一行为一个整数 n(1≤n≤106),表示序列的长度。
第二行为 n 个整数 a1,a2,…,an(1≤ai≤106,且单组测试数据内 ∑ai≤106),表示序列的元素。
保证同一个文件内所有测试用例的 n 的总和不超过 106,所有测试用例的 ∑ai 的总和不超过 106。
输出格式
对于每个测试用例,输出一行一个整数,表示和为素数的子段数量。
样例
输入:
1 | 2 |
输出:
1 | 5 |
样例解释
在第一个样例中,满足条件的 (l,r) 数对如下:
l=1,r=2:该子段的和为 3。
l=2,r=2:该子段的和为 2。
l=2,r=3:该子段的和为 5。
l=3,r=3:该子段的和为 3。
l=3,r=4:该子段的和为 7。
1 |
题目描述
在一个 n×m 的网格平面上,有一个关键区域。该区域是一个闭矩形,其四个顶点的坐标分别为 (a,b)、(a,d)、(c,d)、(c,b),其中 0≤a<c≤n 且 0≤b<d≤m。
现在会随机选择一条从 (0,0) 到 (n,m) 的合法路径。合法路径是指每一步只能向右(x 坐标加 1)或向上(y 坐标加 1)的格点路径。
这条路径必定会将整个平面分成“左上”和“右下”两部分(允许其中一部分为空)。我们关注的是该关键区域是否会被这条路径切断。如果整个闭矩形区域完全位于路径的同一侧(完全在“左上”部分或完全在“右下”部分),则称该关键区域保持“完整”;否则视为被路径切断。
求在所有等概率选择的合法路径中,关键区域保持“完整”的概率。答案需要对 998244353 取模。
输入格式
第一行包含一个整数 T(1≤T≤104),表示测试用例的数量。
接下来每行代表一个测试用例,包含六个整数 n,m,a,b,c,d(1≤n≤103,1≤m≤106,0≤a<c≤n,0≤b<d≤m),其含义如题目描述所示。
输出格式
对于每个测试用例,单独输出一行一个整数,表示关键区域保持“完整”的概率对 998244353 取模后的结果。
样例输入
1 | 3 |
样例输出
1 | 1 |
样例解释
在第一个测试用例中,关键区域的大小为 1×1。它永远不会被任何路径切断,因此保持完整的概率为 1。
在第二个测试用例中,关键区域的大小为 3×3,即覆盖了整个纸张。由于除非其中一部分为空,否则撕裂路径总是将纸张分成两个非空部分,因此关键区域保持完整的概率为 202,即 101。对 998244353 取模后输出 299473306。

在第三个测试用例中,关键区域保持完整的概率为 208,即 52。对 998244353 取模后输出 199648871。
完全理解隔板法(stars and bars)(插板法应用的特征)
我觉得是类似于这样子思考。


隔板法的思想就是,把 a 插入 d 个空格当中,换为给 a 加上 d-1 个隔板。
1 |