9月做题纪要

9月做题纪要

9.3/9.4

P3376 【模板】网络最大流

因为 Dinic 对于求最大流是比较优的算法,考虑对 Dinic 进行一个复习

Dinic 属于 Ford-Fulkerson 增广路算法,每次增广前我们都先用 BFS 将图分层,每个点的层数都是其距离源点的最短距离

求解思路如下:

  • 对原图进行 BFS 构建分层图

  • 考虑 EK 算法的核心问题在于一次只能扩展一条增广路,我们在 Dinic 中为了优化考虑使用 DFS 来一次寻找多条增广路

    DFS 可以同时寻找出多条增广路,因此相对来说 Dinic 对于 EK 算法较优

此时我们就完成了 Dinic 算法的基础,乍一看单次 DFS 时间复杂度是 \(O(VE)\) 的,但是我们发现一个问题:DFS 可能会经过很多次同一个点,那么复杂度就是不严格的

考虑对 Dinic 进行优化

  • 当前弧优化:

    这个优化力度较大,而且直接作用于复杂度上,不会负优化,负优化就是打假了

    由于我不知道怎么描述所以直接用 OI-wiki 上内容

    如果某一时刻我们已经知道边 \((u, v)\) 已经增广到极限(边 \((u, v)\) 已无剩余容量或 \(v\) 的后侧已增广至阻塞),则 \(u\) 的流量没有必要再尝试流向出边 \((u, v)\)

    因此对于每个结点 \(u\),我们直接维护 \(u\) 的出边表中第一条还有必要尝试的出边,下次就直接从这条边开始推,因为这个边之前的肯定已经推满了

    我们称维护的这个指针为当前弧,那么这个优化就是当前弧优化

    在使用当前弧优化的情况下单次 DFS 复杂度是严格的 \(O(VE)\)

    • 证明

      每次找增广路最多找 \(|E|\) 条,长度最多为 \(|V|\),分层图层数严格递增,最多会建 \(|V|\) 次分层图

      那么 Dinic 的复杂度就是 \(O(V^2E)\)

  • 无用点优化

    如果有流量流向一个点的时候,这个点流不动了,那么就说明它在当前分层图上不再能做出贡献,可暂时删去

9.5

(模拟赛)

OI赛制怎么不给大样例啊

T1 dance

最开始想了个假结论然后被自己 \(hack\) 了,\(hack\) 数据010010001

乱搞了一个神秘做法不知道会不会被卡,考虑先记录每个男生/女生所处的位置,然后从大到小枚举区间,看区间内男生和女生人数是否相同,若相同则直接跳出,否则继续寻找

我们先判断男生和女生哪一个更多,然后在记录时记录其中较少的那个,最劣复杂度 \(O(tot^2)\)\(tot\) 为男生和女生中较少的一个

然后特判一些情况,剩下的听天由命,然后果然有问题

考虑我们对这个求男生和女生人数的差值的前缀和,假设这个值是 \(t\),然后我们只需要在两侧找到相同的 \(t\) 即可

然后直接求出区间的长度,在这些长度里求最大值即可

复杂度 \(O(n)\)

T2 string

没看懂,没写,感觉打个 dfs 能拿分,正解一眼是 dp

T3 bignumber

这题是原,我做过

直接线段树+二分即可

9.6

P4722 【模板】最大流 加强版 / 预流推进

我们发现这道题和上一道题基本没有区别,主要的区别是本题数据范围开的更大了,\(O(V^2E)\) 的 Dinic 无法通过

经过测试,朴素 Dinic 在本题只有 \(16\) 分,考虑对 Dinic 进行优化(因为我不会预流推进)

对于 Dinic 有三种做法:Improved DinicLCT DinicDinic 的玄学优化

个人采用的是 Dinic 的玄学优化

  • 先不算反向边跑一边 Dinic,计算反向边的权值,然后加上权值之后再跑一边 Dinic

  • 将所有边按照其容量二进制下的位数从大到小排序,位数相同的合并成一段。

    顺序枚举每一段,在残量网络中加入这一段所有的边,跑一次Dinic,将新增广的流量加入答案

这样就可以通过本题,但是我们直接写发现被卡常了,考虑卡常

首先我们可以把读入方式换为 FastIO

然后把 STL 自带的 queue 换为手打的,然后开 O2 优化即可通过

P1343 地震逃生

裸的最大流模型,直接跑一遍 Dinic 即可,然后对求出的最大流除 \(x\) 之后向上取整,注意这里不要用 ceil 函数不然会自动转化为科学计数法

9.7

P3254 圆桌问题

我们考虑对这道题使用最大流来解决,首先我们考虑将代表视为二分图左边的点,将圆桌视为二分图右边的点

那么我们只需要先建立一个虚拟源点,然后再建立一个虚拟汇点即可

现在的问题是怎么判断有没有解,因为所有人都需要吃饭,所以需要 \(ans = \sum_{i=1}^{n} a_i\) 才能有解

如果判断出有解我们还需要输出路径,考虑每个桌子所有满流边就是对应的情况直接输出即可

9.8

P2756 飞行员配对方案问题

我们考虑对于本题建立一个虚拟源点和虚拟汇点,然后将外籍飞行员和源点连边,英国飞行员与汇点连边,容量为 \(1\)

然后将已经给出的能够配合的外籍飞行员和英国飞行员之间连边,这里的边容量直接放 \(+\infty\)

然后跑一遍 Dinic 即可,然后判断反向边流量是否为 \(0\) 即可

复杂度 \(O(V^2E)\),反正网络流也不用仔细看复杂度

CF739A Alyona and mex

最小的 \(\text{mex}\) 仅会与长度最小的区间有关,为使得 \(\text{mex}\) 最大,当 \(\text{mex}\) 等于区间长度的时候即为所求。

\(ans\) 表示此时得到的答案,我们考虑长度最小的区间一定包含 \([1,ans-1]\) 的所有数

对于其他的区间,一定包含一个长度为 \(ans\) 的区间,让这个区间也包含 \([1,ans-1]\) 的所有数

剩余的可以随便构造,那么我们就可以直接 \([1,ans-1]\) 循环输出即可

9.9

P2763 试题库问题

我们考虑对本题进行建模,考虑先建立一个虚拟源点和一个虚拟汇点

然后考虑边的容量,由于每种题能且只能选择一个,因此我们将源点与试题的边容量设为 \(1\)

同理我们也需要将试题种类与试题的边容量设为 \(1\)

由于我们需要满足多个种类,所以我们将汇点与试题种类之间连的边的容量应该是所需本类型的个数

然后我们需要对应的去跑最大流即可

P1345 [USACO5.4] 奶牛的电信Telecowmunication

首先我们需要了解最小割的概念

对于一个网络流的图,我们考虑将所有点划分为两个集合:\(S\)\(T\),其中 \(s \in S\)\(t \in T\),而割就是这个划分方式

  • 割的容量

    我们定义割的容量为所有从 \(S\)\(T\) 的边的容量之和,也就是说 \(c(S,T)=\sum_{u\in S,v\in T}c(u,v)\)

  • 最小割

    最小割就是求得一个割 \((S,T)\) 使得割的容量 \(c(S,T)\) 最小

  • 最大流最小割定理

    最大流等于最小割的容量

    我们通过 弱对偶性 来证明这个定理。

    • 弱对偶性
      首先,假设我们有一个从 \(s\)\(t\) 的流 \(f\),它的总流量是 \(|f|\)。同时,假设我们有一个割 \(C=(S, T)\),它的容量是 \(\text{c}(S,T)\)

      \(f\) 不可能超过任何割的容量。即对于任意割 \((S, T)\),流 \(|f| \leq \text{c}(S,T)\)。这是因为每个割将网络分成两个部分,\(s\)\(S\) 中,\(t\)\(T\) 中,而流量必须穿过从 \(S\)\(T\) 的边。因此,流的总量受限于这些边的总容量。

      这说明:最大流的值不能超过任何割的容量,因此最大流小于等于最小割的容量

回到正题,我们发现欸这题看着像网络流,写着像网络流,数据也像网络流,啥都像网络流,甚至感觉解法都像网络流

那这不就是网络流吗

我们直接连边最小割,但是跑完只有 \(70\) 分这不就炸了

仔细一看题就能发现问题:我们在最小割中求的是割边,而这道题是割点啊

那怎么办的,考虑拆点,我们将图中的每个点都拆成两个点,如果一个点是 \(i\) 那么这个点就可以拆成 \(i\)\(n+i\) 两个点

我们将这个点之间的边容量设为 \(1\),因为一个点只能删一次

然后原本自带边可以直接设为 \(+\infty\) ,再跑最小割即可,复杂度 \(O(V^2E)\)

但是跑完变 \(10\) 分了???注意 \(S\) 应该拆点拆成 \(S+n\)

P1361 小M的作物

看一眼标签有图论,仔细看题这也不像啊

有图论还不像图论,盲猜一手网络流,既然是网络流,那么再一看两者选其一,那就是最小割

是最小割那就先建模,那好像比较困难,不是很容易建模的样子,因为有个那个额外收益

那就先不考虑额外收益来建图

我们考虑对于一个点,由源点先连接一条种在 \(A\) 里的边,容量为 \(a_i\)

然后从 \(B\) 再向汇点连接一条种在 \(B\) 里的边,容量为 \(b_i\)

如果割掉那就说明不这样种,这就解决了没有额外收益的问题

诶我们发现这额外收益好像是和这个并联的啊,只要割掉其中的一个就没有这个收益了(?)

那么我们直接建立一个 \(x_i\) 和对应的点连边,然后对应的和源点与汇点就直接连 \(c_i\) 就行

那就好说了,先求出再总价值,然后减去最小割即可

9.10

P2774 方格取数问题

首先我们对这道题考虑使用网络流,因为这道题是网络流与线性规划24题里的

我们发现每取一个格子,对应的限制就是不能再取旁边的 \(4\) 的格子,我们先选中全部的方格,然后考虑删除一些比较小的方格

我们发现两个格子相邻时一定满足:两点的横纵坐标之和奇偶性不同

横纵坐标和的奇偶性相同的两个点肯定不互斥,把互斥的点连边的话,会形成一个二分图。

那么我们考虑建模,源点连接所有横纵坐标之和为奇数的点,汇点连接所有横纵坐标为偶数的点,边权则是各个点权

然后内部全都连接互斥的边,容量连 \(+\infty\) 防止被割

然后我们发现割就是表示不取某个方格,那直接总得分减去最小割即可

这就过了

P4474 王者之剑

和上一道题应该算是多倍经验,只要对输入输出作出修改即可通过

P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题

这道题个人与个人之间的难度感觉差距很大,毕竟是构造。

首先考虑对于原式 \(a+b+c+d=\gcd(a,b)+\text{lcm}(c,d)\),我们考虑挂着一个 \(\gcd\) 不是很好维护,因此先让 \(\gcd(a,b)=1\),也就是 \(b=1\)

然后这个式子就转化成了 \(a+c+d=\text{lcm}(c,d)\),此时我们可以考虑对 \(\text{lcm}(c,d)\) 进行转化,\(\text{lcm}(c,d)=\frac{cd}{\gcd(c,d)}\),我们考虑再次让 \(\gcd(c,d)=1\)\(\text{lcm}(c,d) = cd\)

那么对原式进行移项,再合并同类型即可得到 \((c-1)(d-1)=a+1\)

我们将格式写为 \(c=\frac{a+1}{d-1}+1\)

接下来分类讨论:

  • 如果 \(a+1\) 为偶数即 \(a\) 为奇数

    此时我们直接让 \(d=2\)\(c\) 的值就是 \(a+2\),我们知道 \(a\) 是奇数,因此 \(\gcd(c,d)=1\)\(c\)\(d\) 的值都能求出。

  • 如果 \(a+1\) 为奇数即 \(a\) 为偶数

    如果我们再让 \(d=2\),此时 \(\gcd(c,d)=2\) 因此不成立。

    我们考虑对 \(a+1\) 进行质因数分解,移出其中一个 \(p^i\) 赋值给 \(d-1\),此时 \(c\)\(d\) 都能求出

这样我们就解决了这个问题。

P9156「GLR-R4」芒种

一眼期望(阿绫都问期望得分了能不是期望吗),开推。

  • 选择一张已知牌一张未知牌的得分概率为 \(p= \dfrac{1}{2n-m}\),后手得分的概率为 \(p=\dfrac{m-1}{2n-m}\),先手得分则概率为\(p= \dfrac{2n-2m}{2n-m}\),转移方程为

\[dp(n,m)=\max(dp(n,m),\dfrac{1+ dp(n-1,m-1) - (m-1)(1+dp(n-1,m-1)) - 2(n-m)\times dp(n,m+1)}{2n-m}) \]

  • 选择两张未知牌的先手得分概率为 \(p=\dfrac{n-m}{((2n - m) \times ( 2n - m - 1))}\) 后手得分概率为\(p=\dfrac{m\times(m-1)/2}{((2n - m) \times (2n - m - 1))}\),如果先手得分则概率变为\(p=\dfrac{(n-m) \times (n-m-1)}{((2n - m) \times (2n - m - 1))}\)。 转移方程为

\[dp(n,m)=\max(dp(n,m),\dfrac{2\times((n-m)\times(1+dp(n-1,m)) - m\times(m-1)/2 \times(2+dp(n-2,m-2)) - 2\times m\times (n-m) \times (1+dp(n-1,m)) -2\times(n-m)\times(n-m-1) \times dp(n,m+2) }{(2*n-m)\times(2*n-m-1)})\]

  • 先手选两张已知牌:如果这个是最优解后手也会选已知牌,那么会直接和棋,转移方程为

\[dp(n,m)=\max(dp(n,m),0) \]

然后组合一下这题就出来了。

9.12

P8478 「GLR-R3」清明

解题报告

9.13

P3806 【模板】点分治 1

点分治是好算法,所以考虑学一下。

对于这道题,最朴素的思路就是暴力枚举然后 DFS,复杂度 \(O(n^2)\),明显不是很优。

那么对于这种情况,我们考虑进行点分治。

我们随意的挑选一个节点 \(v_i\) 作为树根,对于任何位于其子树内的路径都有且仅有两种情况:

  • 路径上包含 \(v_i\)
    • 有一个端点为 \(v_i\)
    • 两个端点均不为 \(v_i\)
      可以由两条端点为 \(v_i\) 的链合并而成
  • 路径上不包含 \(v_i\)

对于前者,我们可以直接求 \(dis_u\)\(dis_v\) 两者相加。\(judge_{d}\) 表示之前处理的子树中是否存在长度为 \(d\) 的路径

若一个询问的 \(k\) 满足 \(judge_{k-dis_{x}}=1\) 说明存在长度为 \(k\) 的路径,处理完一棵子树的询问后及时更新 \(judge\),但是我们不能直接 \(memset\) 不然复杂度会假ww

将占用过的 \(judge\) 的位置加入一个队列里,然后进行清空

对于后者,考虑分治,对于枚举的 rt,先计算在其子树内且经过 rt 的路径对答案产生的贡献,然后递归其子树对不经过该节点的路径进行求

点分治过程中,每一层的所有递归过程对每个点处理一次,时间复杂度为 \(O(hn)\) ,其中 \(n\) 为树高/递归层数。

我们选取重心为 \(rt\) 可以让时间复杂度达到 \(O(n \log n)\)

9.14

P10217 [省选联考 2024] 季风

联合省选D1T1

这题我啥时候过的?

首先我们让 \(x_i=x_{i\%m+1}\)\(y_i\) 同理。

要求一个最小非负整数 \(m\) 使 \(|\sum\limits_{i=1}^mx_i-X|+|\sum\limits_{i=1}^my_i-Y|\leq mk\)

直接把绝对值拆了

\[\begin{cases} \sum\limits_{i=1}^m(x_i+y_i+k)\geq X+Y\\ \\ \sum\limits_{i=1}^m(x_i-y_i+k)\geq X-Y\\ \\ \sum\limits_{i=1}^m(-x_i+y_i+k)\geq -X+Y\\ \\ \sum\limits_{i=1}^m(-x_i-y_i+k)\geq -X-Y\\ \end{cases} \]

如果有一个 \(m\) 满足上面所有的条件,那么这个 \(m\) 是合法的

分析第一种情况。

首先设 \(s_i=\sum\limits_{j=1}^i(x_j+y_j+k)\)\(pos=X+Y\)

发现如果 \(s_i+ks_n\geq X+Y\),根据 \(s_n\) 的取值,\(k\) 有不同的范围。

\(s_n>0\) 时,我们可以获得一个 \(k\) 的下界,反之则会获得一个上界。

\(s_n=0\) 时,若 \(s_i\geq X+Y\),则 \(k\) 可取任意值,否则无解。

当我们对四种情况都进行了一遍求上界(下界)之后,我们的 \(k\) 会锁定在一个区间 \([l_i,r_i]\) 内。

也就是说,\(m=i+kn(l_i\leq k\leq r_i)\) 都是合法的。

枚举 \(i\),若 \(l_i\leq r_i\),即存在合法区间,那么 \(ans=\min(ans,i+l_in)\)

P9154 「GLR-R4」立夏

诈骗题,不要看简要题意

我们直接采用第一篇题解的好题意

\(T\) 条半透明的发绳,每条发绳由白色紫色的格子组成。将其从中间对折,会出现以下三种情况:

  • 白色 + 白色 = 白色(记作 \(0\)
  • 白色 + 紫色 = 浅紫色(记作 \(1\)
  • 紫色 + 紫色 = 深紫色(记作 \(2\)

特别的,对于最中间的格子,只会出现以下两种情况:

  • 白色 = 白色(记作 \(0\)
  • 紫色 = 浅紫色(记作 \(1\)

现在给出一个三进制数的十进制形式,表示对折后的发绳颜色,请你求出原始的发绳有几种颜色组成方案。

这样看一下子就简单了,当一个格子颜色为 \(0\)\(2\),这个位置上的格子颜色组合就只有一种情况

对折后格子的颜色为 \(1\),那么这个位置上两个格子的颜色组合有两种情况

那挺简单的啊,直接做就行

9.17

P9868 [NOIP2023] 词典

题面理解难度比题高

由于可以交换任意两个字符且不限次数,所以可以得到当前字符串的任意一种排列。

那么只需要使当前串达到字典序最小的状态,其他字符串均达到字典序最大的状态,再进行比较即可。

先处理出每个字符串的最小值和最大值,如果当前串的最小值比其他每个字符串的最大值都要小,那么可以将其他字符串的最大值都放在串首,将当前串的最小值放在串首。

这样就可以使当前串的字典序最小了。

9.18

P1919 【模板】高精度乘法 | A*B Problem 升级版

这题有紫?FFT 秒了,这不纯板子

但是我不想写 FFT,那就写个 NTT 也能过

此时可能就有人要说了:啊这题连个模数也没有你直接强行加个模数不怕爆炸吗

我直接选取 \(998244353\) 作为 NTT 模数,我们发现 FFT 之后的结果最大 \(4860000\),远小于模数,那不是随便过

那不就是直接 NTT 即可,复杂度 \(O(N \log N)\),超优复杂度

tip:其实这题是写【第二类斯特林数·行】的时候因为写了 NTT 就顺手过了,没写 FFT 是因为【第二类斯特林数·行】不能用 FFT

P5395 第二类斯特林数·行

我们知道,第二类斯特林数(\(\begin{Bmatrix} n \\m \end{Bmatrix}\)\(S(n,m)\))表示把\(n\)不同元素划分成\(m\)相同的集合中(不能有空集)的方案数。

考虑怎么求第二类斯特林数·行呢

  • 递推求解

    我们对于第二类斯特林数可以暴力枚举,然后求解

    讨论第一个球是不是单独的在一个盒子里。

    我们插入一个新元素时,有两种方案:

    • 将新元素单独放入一个子集,有 \(S(n-1,k-1)\) 种方案;
    • 将新元素放入一个现有的非空子集,有 \(k\cdot S(n-1,k)\) 种方案。

    边界是 \(S(n,0) = [n=0]\)

    根据加法原理,只要将两者相加就是答案,因此 \(S(n,k)=S(n-1,k-1)+k\cdot S(n-1,k)\)

    复杂度 \(O(n^2)\),经测试可以得到 \(20\) 分,证明这个复杂度是非常劣的

  • 考虑采用通项公式

    \[S(n,m)=\sum\limits_{i=0}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!} \]

    这个是第二类斯特林数·行的通项公式

    这里枚举空盒的个数,剩下的随意放置,由于盒子是相同的最后要除以 \(m!\)

    可以列出公式:\(S(n,m) = \frac{1}{m!}\sum\limits_{i=0}^{m}(-1)^k\binom{m}{k}(m-k)^n\)

    我们对这个式子推一下

    \[\begin{aligned}\frac{1}{m!}\sum\limits_{k=0}^{m}(-1)^k\binom{m}{k}(m-k)^n&=\frac{1}{m!}\sum\limits_{k=0}^{m}(-1)^k\frac{m!}{k!(m-k)!}(m-k)^n\\&=\frac{1}{m!}\sum\limits_{k=0}^{m}m!\frac{(-1)^k(m-k)^n}{k!(m-k)!}\\&=\sum_{k=0}^m\frac{(-1)^k(m-k)^n}{k!(m-k)!}\end{aligned} \]

    这是好格式,直接 NTT 大力卷一下,复杂度 \(O(n \log n)\)

    const int mod=167772161;
    int G=3,invG;
    const int N=2400000;
    int qpow(int b,int n){
        int res=1;
        while(n){
            if(n&1) res=res*b%mod;
            b=b*b%mod; n>>=1;
        }
        return res;
    }
    int tr[N];
    void NTT(int *f,int n,int fl){
        for_(i,0,n-1)
            if(i<tr[i]) 
                swap(f[i],f[tr[i]]);
        for(int p=2;p<=n;p<<=1){
            int len=(p>>1);
            int w=qpow((fl==0)?G:invG,(mod-1)/p);
            for(int st=0;st<n;st+=p){
                int W=1,tmp;
                for_(i,st,st+len-1)
                    tmp=W*f[i+len]%mod,
                    f[i+len]=(f[i]-tmp+mod)%mod,
                    f[i]=(f[i]+tmp)%mod,
                    W=W*w%mod;
            }
        }
        if(fl==1){
            int invN=qpow(n,mod-2);
            for_(i,0,n-1)
                f[i]=(f[i]*invN)%mod;
        }
    }
    int f[N],g[N],a[N],b[N],fac[N],inv[N];
    signed main(){
        invG=qpow(G,mod-2);
        int n = read();
        fac[0]=1;
        for_(i,1,n)
            fac[i]=1ll*fac[i-1]*i%mod;
        inv[n]=qpow(fac[n],mod-2);
        _for(i,n-1,0)
            inv[i]=1ll*(i+1)*inv[i+1]%mod;
        for_(i,0,n){
            a[i]=(i&1?mod-inv[i]:inv[i]);
            b[i]=qpow(i,n)*inv[i]%mod;
        }
        int limit=1;
        while(limit<=(n<<1)) 
            limit<<=1;
        for_(i,0,limit)
            tr[i]=(tr[i>>1]>>1)|(i&1?limit>>1:0);
        NTT(a,limit,0);NTT(b,limit,0);
        for_(i,0,limit)
            a[i]=a[i]*b[i]%mod;
        NTT(a,limit,1);
        for_(i,0,n){
            write(a[i]),putchar(' ');
        }
    }
    

9.19

P10254 口吃

  • 题意:

    一个长度为 \(n\) 的排列合法当且仅当逆序对数为 \(k\),给定 \(n\)\(k\),求出所有合法排列的价值和。

    价值定义为 \(\sum a_i \times i\)

直接 dp 的话,每一个位置的数的贡献是有后效性的

我们考虑把贡献拆开计算,对于每一个 \(i\),我们可以把 \(a_i \times i\) 拆成 \(sum0 \times a_i + sum1 \times a_i\),其中 \(sum0/1\) 分别表示在 \(1\)\(i\) 中大于等于 / 小于 \(a_i\) 的数的个数。

我们分别求出这两个的答案,最终相加即可

假设我们从 \(n\) 开始降序选数,设 \(f_{i,j}\) 表示选完了 \(i\) 个数,逆序对数为 \(j\) 的方案数;

\(g_{i,j}\) 表示选完了 \(i\) 个数,逆序对数为 \(j\) 的总价值和;

\(P\) 表示前 \(i-1\) 个数的逆序对数最少是多少,那么有:

\[P=\max(0,j-(i-1)) \]

\[f_{i,j}=\sum_{p=P}^{j} f_{i-1,p} \]

\[g_{i,j}=\sum_{p=P}^{j} g_{i-1,p} +f_{i-1,p} \times (n-i+1) \times (j - p + 1) \]

复杂度是 \(O(n^2 k)\) 的,用前缀和优化,复杂度 \(O(nk)\)

P4091 [HEOI2016/TJOI2016] 求和

我们考虑对于这个式子考虑化简

因为 \(S(i,j)=0(j>i)\),所以原式等于

\[\sum\limits_{i=0}^n \sum\limits_{j=0}^n S(i,j) \times 2^j\times j! \]

改变枚举顺序,上式等于

\[\sum\limits_{j=0}^n2^j\times j! \sum_{i=0}^n S(i,j) \]

因为\(S(n,m)=\sum_{i=0}^m(-1)^{i}\times \frac{1}{i!(m-i)!}\times (m-i)^n\),所以上式等于

\[\sum\limits_{j=0}^n2^j\times j! \sum_{i=0}^n \sum_{k=0}^j(-1)^k\times \frac{1}{k!(j-k)!}\times (j-k)^i \]

\(k\) 的枚举提前,上式等于

\[\sum\limits_{j=0}^n2^j\times j! \sum_{k=0}^j(-1)^k\times \frac{1}{k!(j-k)!}\times \sum_{i=0}^n (j-k)^i \]

看起来不好看,把后面的东西换成和 \(j\) 有关的式子,令

\[g[j]=\sum_{k=0}^j(-1)^k\times \frac{1}{k!(j-k)!}\times \sum_{i=0}^n (j-k)^i \]

于是答案就是

\[\sum_{j=0}^n2^j\times j!\times g[j] \]

9.22

P5396 第二类斯特林数·列

第二类斯特林数·行的难度只有紫,但是第二类斯特林数·列居然有黑,确实比较神奇

可以发现这道题和第二类斯特林数·行的唯一区别就是求得是列

  • 部分分

    20pts 直接和第二类斯特林数·行一样暴力通过递推求解即可

  • 正解

    考虑采取类似第二类斯特林数·行的做法,首先需要拿到一个通项公式才能卷积

    我们设 \(S_n(x)\) 表示第二类斯特林数第 \(n\) 列的生成函数,即

    \[S_m(x)=\sum_{i=0}^\infty \begin{Bmatrix}i\\ m\end{Bmatrix}x^i \]

    那么有

    \[S_m(x)=xS_{m-1}(x)+mxS_m \]

    \[(1-mx)S_m(x)=xS_{m-1}(x) \]

    \[S_m(x)=\frac{x}{1-mx}S_{m-1}(x) \]

    \[S_m(x)=\frac{x^m}{\prod\limits_{i=1}^m (1-ix)} \]

    我们通过分治乘法算出下面,然后求逆后位移即可。

    复杂度 \(O(n\log^2 n)\)

    对于多项式 exp 做法,虽然复杂度是 \(O(n\log n)\) 但是复杂度极大,跑的还没 \(O(n \log n)\)

我的评价:分治乘法+第二类斯特林数就能直接出的题能有黑我是真没想到

posted @ 2024-09-23 06:33  Vsinger_洛天依  阅读(61)  评论(4编辑  收藏  举报