ARC202 小记
A (Merge and Increment)
题意
对于一个序列,定义一次操作为:消除相邻两个 \(=x\) 的数,在同一位置插入 \(x+1\)。
若一个序列能通过若干次操作长度变为 \(1\),则称其是好的。
给定一个长度为 \(n\) 的序列 \(a\),求最少往 \(a\) 中插入几个数使得其变成好的。其中插入可以往任意位置插入任意数。
\(1\le n\le 2\times 10^5,a_i\in [1,10^9]\)
题解
xjb 猜结论贪心。
我最开始猜了一个:每次选择当前最小值(若多个选最前),找到其左右两侧最小的,把这两个数合并更新,就是 \((x,y)\to \max(x,y)+1\)。
但是这个结论有点小问题:比如 1 1 1 1 1 2 的时候,先合并成 2 2 1 2,然后第三个 \(1\) 可能和左边的 \(2\) 合并,就坠机了。
这启发我们每次先抬升 \((x,y)\to (\max(x,y),\max(x,y))\),然后再从左到右继续抬升 \((x,x)\to x+1\),这样就是对的了。
注:这东西和官方题解的结论是本质相同的,可以仔细想想。
用 对顶堆 和 链表 维护即可,复杂度 \(O(n\log n)\)。
B (Japanese "Knight's Tour")
题意
有一个 \([0,H-1]\times [0,W-1]\) 的棋盘,初始你在 \((0,0)\) 位置有一个马。
马每次可以从 \((x,y)\to (x-2,y\pm 1)\),其中坐标分别 \(\bmod H,\bmod W\)。
要求马通过 \(H\times W\) 次遍历所有位置,最终回到 \((0,0)\)。
求不同的方案数,对 \(998244353\) 取模。
\(3\le H,W\le 2\times 10^5\)
题解
- 下面把原题的 \((H,W)\) 重新定义为 \((n,m)\)。
首先注意到第 \(k\) 步所在的行位置是固定的:\((-2k)\bmod n\)。
于是我们把行重排列:\(0\to -2\to -4\to \cdots\)。
- 发现当 \(n\) 为偶数的时候奇数行遍历不到,答案为 \(0\)。
否则重定义移动为:\((+1,-1),(+1,+1)\),要求遍历整个棋盘并且回到 \((0,0)\)。
形式化描述第 \(i\) 步的移动为:\((+1,+d_i),d_i=\pm 1\)。
令 \(x_k=k\bmod n,y_k=\sum\limits_{i=1}^{k} d_i\bmod m\),我们重定义要求:
要求当 \(k\in [1,nm]\) 时 \((x_k,y_k)\) 两两不同,\((x_{nm},y_{nm})=(0,0)\)。求选择 \(d\) 的方案数。
把 \(y\) 写成 \(\color{red}{m\times n}\) 的数表,要求变为每列的 \(y\) 两两不同,\(x_{nm}=y_{nm}=0\)。
于是每列 \(y\) 构成 \(0\sim m-1\) 的排列。
同时把 \(x,y,d\) 的下标也拍到二维上。
下面用 \(x_{a,b}\) 来称呼 \(x_{(b-1)m+a}\)。
- \(m\) 奇数
作差 相邻两列和,由于都是 \(1\sim m\) 排列,于是和相同。举例 \(1,2\) 列:
由于 \(m\) 是奇数,若干个 \(\pm 1\) 合成 \(\bmod m=0\) 的数,于是只能都是 \(+1\) 或 \(-1\)。
其他行同理,第一行随便分析下发现也一样。
- \(m\) 偶数
分析奇偶性,举例 \(1,2\) 列:发现 \(y_{2k+1,1}\) 构成 \(1,3,\cdots,m-1\),\(y_{2k+1,2}\) 构成 \(2,4,\cdots,m\)。
依然作差有:
于是 \(d_{2k+1,2}\) 这堆数也只能全 \(1\) 或全 \(-1\)。
其他行同理,第一行随便分析下发现也一样。
\(m\) 为奇数的时候相当于钦定 \(n\) 个 \(\pm 1\) 的数,设这些和为 \(s\)。
要求 \(\{s,2s\cdots,ms\}\) 在 \(\bmod m\) 下两两不同,等价于 \((s,m)=1\)。
同理,\(m\) 为偶数的时候相当于钦定 \(2n\) 个 \(\pm 1\)。
记 \(F(n,m)\) 表示选 \(n\) 个 \(\pm 1\),使得 \((s,m)=1\) 的方案数。
\(F(n,m)=\sum\limits_{i=0}^{n}\dbinom{n}{i}[(2i-n,m)=1]\),直接 \(\mathcal{O}(n\log n)\) 计算即可,瓶颈在于 \(\gcd\)。
奇数时答案为 \(F(n,m)\),偶数时为 \(F(2n,m)\)。
C (Repunits)
题意
定义 \(R(k)=11\cdots1\),其中总共有 \(k\) 个 \(1\)。
给定长为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\),定义 \(\forall k\in [1,n],ans_k=\mathop{\text{lcm}}\limits_{1\le i\le k} R(a_i)\)。
求 \(ans_{1},ans_2,\cdots,ans_n\),对 \(998244353\) 取模。
\(1\le n,a_i\le 2\times 10^5\)
题解
写了和官方题解同复杂度的 \(\mathcal{O}(N\log \log N)\) 的做法,其中 \(N=\max(n,m)\)。截止 \(2025/7/22\) 是 AT 全站最优解,代码也很短。
前置知识:\(\gcd-\,\text{lcm}\) 反演,狄利克雷前缀和那一套,\(\mathcal{O}(n)\) 求 \(n\) 个数逆元。
注意到:\(R(a)=\dfrac{10^a-1}{9},\quad\gcd(R(a),R(b))=\dfrac{1}{9}\gcd(10^a-1,10^b-1)=\dfrac{10^{\gcd(a,b)}-1}{9}=R(\gcd(a,b))\)。
于是 \(\gcd\limits_{x\in S} R(x)=R(\gcd(S))\)。
我们暂时只讨论 全局答案,先推一推。
先来个 \(\gcd-\,\text{lcm}\) 反演:
然后 \(\gcd=d\) 不好做,容斥成 \(d\mid\gcd\):
其中 \(n_d\) 表示 \(a\) 中是 \(d\) 的倍数的数的个数。
预处理 \(R,\mu,z\) 等。
加入 \(x\) 的时候,计算 \(x\) 的因数 \(d\) 加入后对 \([n_d>0]\) 的影响,然后贡献乘到答案。
复杂度 \(\mathcal{O}(N\log N)\) 或 \(\mathcal{O}(N\log mod)\),足以通过此题。
接下来一个个优化,先来预处理 \(z\)。
我们记录 \(R(1\sim n)\) 和 \(R(1\sim n)^{-1}\),用个线性逆元做到线性。
然后对于 \(z(n)=\prod\limits_{d\mid n} R(d)^{\mu(n/d)}\) 看成乘积形式的 狄利克雷前缀差分,同时维护 \(x,x^{-1}\) 转移,就解决了除法。
把 \(ans_k\) 写好看点:
于是我们只需对每个 \(d\) 记录其最早出现在乘积里的时刻即可。
初始 \(t_{1\sim n}=+\infty\),然后遍历 \(x\in [1,n],t_x\overset{\min}{\longleftarrow}x\),最后 \(t'_x=\min\limits_{x\mid d}t_d\)。
求得的 \(t'\) 就是最早出现的时刻。用狄利克雷后缀 \(\min\) 优化即可。
于是总复杂度做到 \(\mathcal{O}(N\log \log N)\),是目前科技的最优解。
D (King)
题意
给定 \([1,n]\times [1,m]\) 的棋盘,一个王要恰好 \(T\) 步从 \((A,B)\) 走到 \((C,D)\),并且不能走出棋盘。
求不同游走方案数,对 \(998244353\) 取模。
- 王能移动到相邻八连通位置。即从 \((i,j)\) 能移动到 \((i+1,j+1),(i+1,j),(i+1,j−1),(i,j+1),(i,j−1),(i−1,j+1),(i−1,j),(i−1,j−1)\)。
\(1\le n,m,T,A,B,C,D\le 3\times 10^5\)。5s。
题解
这里给出一个 不用多项式乘法 的 \(\mathcal{O}(T^{1.5})\) 的做法。事实上这个比用多项式乘法略微困难。
首先由于王不能静止,我们进行容斥,来独立出横纵坐标。
记 \(q_i\) 表示王每次 能走或者静止,走 \(i\) 步走到 \((C,D)\) 的方案数。
根据二项式反演,容易得出:
接下来 \(q_i\) 可以拆封成 \(A\to C,B\to D\) 两部分。
我们只需 \(\forall 0\le i\le T\) 求出 \(F(n,A,C,i)\),表示:
初始 \(x=A\),每次 \(x\gets x+\Delta(\Delta\in [-1,1])\),\(x\) 始终在 \([1,n]\) 范围内。最终 \(n\) 次后 \(x=C\) 的方案数。
那么 \(q_i=F(n,A,C,i)F(m,B,D,i)\),接下来计算 \(F\)。
这东西首先想到 反射容斥。
假设我们对于固定的 \(d\),能快速处理出 \(f_k=[x^d](x^{-1}+1+x)^k,k\in [0,T]\)。
那么直接套用 双直线反射容斥,总共进行 \(\mathcal{O}(\frac{T}{n})\) 轮。
每轮计算出反射后的 \(d=|A'-C'|\),计算出对应的 \(f_i\),乘上容斥系数并贡献,即 \(op\times f_i\to F(n,A,C,i)\)。
假设我们能 \(\mathcal{O}(T)\) 预处理出上面的 \(f\),那么此时复杂度 \(\mathcal{O}(\frac{T^2}{n})\)。
再拼上一个暴力 \(\mathcal{O}(nT)\) 的 dp,平衡取 \(n=\mathcal{O}(\sqrt T)\) 即可。
接下来给定 \(d\),想 \(\mathcal{O}(T)\) 预处理 \(f_k=[x^d](x^{-1}+1+x)^k,k\in [0,T]\)。
为了便利 懒惰的读者,我们先直接给出做法:
令 \(f_0=[d=0],g_0=[d=1]\),递推:
特别的,若 \(i=d-1\),则 \(f_i=0,g_i=1\)。
最终求得的 \(f\) 就是答案。
下面是出推导过程。
记 \(c_{k,i}=[x^{d+i}](x^{-1}+1+x)^k=[x^{d+k+i}](1+x+x^2)^k\),那么 \(f_k=c_{k,0}\)。
然后非常巧妙的,我们先写一个 \(k\to k+1\) 的二维递推。再写一个 微分有限,表示固定 \(k\),对于 \(i\) 这一维的递推。
然后两个递推结合起来,就能算了。
二维递推:
微分有限:
\(\begin{aligned} &f=(1+x+x^2)^k,f_i=[x^i]f,f'_i=[x^i]f' \\ \\ &f'=k(2x+1)(1+x+x^2)^{k-1}\Rightarrow (1+x+x^2)f'=k(2x+1)f \\ \\ &f'_{n-2}+f'_{n-1}+f'_{n}=k(2f_{n-1}+f_n)\Rightarrow (n-1)f_{n-1}+nf_{n}+(n+1)f_{n+1}=2kf_{n-1}+kf_n \\ \\ &(n+1)f_{n+1}=(k-n)f_n+(2k-n+1)f_{n-1} \end{aligned}\)
根据微分有限,对于 \(c\),带入 \(i=0\) 与 \(i=-1\):
带入
整理得:
令 \(f_k=c_{k,0},g_k=c_{k,-1}\) 即可得到 \(f,g\) 递推式。
代码是目前所有 有效提交 的最短解,但是速度可能比一些用 NTT 的选手慢。

浙公网安备 33010602011771号