2025.2.27 NOI 模拟赛 题解
T1 AT_ddcc2020_qual_f DISCOSMOS 多测版
题意
给定 \(n,m,t\),一个 \(n\times m\) 的网格上每个网格数字为 \(0/1/2\),经过一秒所有数字 \(1\) 向右移动一位(移出边界则从左侧回来),数字 \(2\) 向下移动一位(移出边界则从上方回来),数字 \(0\) 不动,所有移动同时进行,数字可以重叠,求有多少种填数的方法,使得 \(kt\;(k\in \mathbb N)\) 秒后所有格子内都有恰好一个数字,\(n,m,t\le10^9\),多测 \(T\le10^6\)
分析
令 \(Rs(n,m,t)\) 表示 \((n,m,t)\) 时的方案集合
假定矩阵下标为 \((0\sim n-1,0\sim m-1)\),含式子的下标对 \(n\) 和 \(m\) 取模
令 \((i\bmod \gcd(n,t),j\bmod \gcd(m,t))\) 相同的格子 \((i,j)\) 构成一个同余类,则不同同余类之间独立,\(|Rs(n,m,t)|=\left|Rs\left(\dfrac n{\gcd(n,t)},\dfrac m{\gcd(m,t)},t\right)\right|^{\normalsize\gcd(n,t)\gcd(m,t)}\)
因此只需要考虑 \(t\) 和 \(n,m\) 互质的情况
当 \(t\ne 1\) 时,可证 \(Rs(n,m,t)\) 对应解集和 \(Rs(n,m,1)\) 对应解集构成双射,因此 \(|Rs(n,m,t)|=|Rs(n,m,1)|\)
因此只需要考虑 \(t=1\) 的情况,即每一步运动后都要满足没有数字重叠
对于 \(x\in \mathbb N_{\gcd(n,m)}\),定义 斜线 为格子集合 \(\left\{(t,x-t) \middle| t\in \mathbb N_{<\normalsize\frac{nm}{\gcd(n,m)}}\right\}\)(即从 \((0,x)\) 开始每次 \(x\) 坐标加一 \(y\) 坐标减一,出边界后从另一侧回来,最终到达起点,在这个过程中经过的所有格子的集合)
则每个格子恰好属于一条斜线,每条斜线都遍历了 \(n\) 行和 \(m\) 列
显然同一行中不可能同时存在 \(0\) 和 \(1\),同一列中不可能同时存在 \(0\) 和 \(2\)
而同一斜线中不可能同时存在 \(1\) 和 \(2\)(假设 \((x,y)\) 为 \(1\),\((x-t,y+t)\) 为 \(2\),则经过 \(t\) 步两者在 \((x,y+t)\) 处相遇)
有结论:网格中不可能同时存在 \(0,1,2\)
证明:
- 等价于证明 当网格中存在 \(0/1\) 时一定不存在 \(2\)
- 当存在一条斜线全是 \(0\) 时,由于这条斜线遍历了 \(n\) 行,因此网格中的任意一个 \(1\) 向右移动若干步后一定会遇到 \(0\),从而不合法
- 当存在一条斜线全是 \(1\) 时,同样由于这条斜线遍历了 \(n\) 行,移动若干步后网格中任意一个 \(0\) 一定会与某个 \(1\) 相遇,从而不合法
- 因此 当合法网格中存在 \(0/1\) 时,每一条斜线都同时存在 \(0\) 和 \(1\)
- 任意选择一条斜线,由于其同时含有 \(0\) 和 \(1\),因此一定可以找到斜线上相邻两个位置 \((x,y)\) 和 \((x+1,y-1)\),使得前者为 \(0\),后者为 \(1\)
- 考虑位置 \((x+1,y)\),由于同一行中不可能同时存在 \(0\) 和 \(1\),同一列中不可能同时存在 \(0\) 和 \(2\),因此其不能为 \(0\),也不能为 \(2\),故其必然为 \(1\)
- 然后考虑位置 \((x,y+1)\),由于同一行中不可能同时存在 \(0\) 和 \(1\),同一斜线中不可能同时存在 \(1\) 和 \(2\),可得其必为 \(0\)
- 从而得出 \((x,\ast)\) 为 \(0\),\((x+1,\ast)\) 为 \(1\)
- 即 任意一个同时存在 \(0\) 和 \(1\) 的合法网格中一定存在一行全为 \(0\)
- 若该网格中同时存在 \(2\),则其向下移动若干步后一定会和一个 \(0\) 相遇,从而不合法
- 因此 \(t=1\) 时,一个合法网格中不可能同时存在 \(0/1/2\)
于是只可能
\((1).\) 全为 \(0/1/2\)
\((2).\) 同时含有 \(0/1\)
\((3).\) 同时含有 \(0/2\)
\((4).\) 同时含有 \(1/2\)
\((1)\) 对应的三种情况都一定合法,方案数为 \(3\)
\((2)\) 对应的情况中,同一行内必须相同,行之间独立,每行都可以是 \(0\) 或 \(1\),但不能全是 \(0\) 或全是 \(1\),方案数为 \(2^n-2\);\((3)\) 同理方案数为 \(2^m-2\)
\((4)\) 对应情况中,每一条斜线必须全为 \(1\) 或 \(2\),斜线之间独立,每条斜线都可以是 \(1\) 或 \(2\),但不能全是 \(1\) 或全是 \(2\),一共 \(\gcd(n,m)\) 条斜线,方案数为 \(2^{\gcd(n,m)}-2\)
时间复杂度 \(O(T\log V)\)
T2 P10009 [集训队互测 2022] 线段树
题意
给定 \(a_{1\sim n}\),\(m\) 次操作,单点查询 \(a_x\),或给定 \(l,r,x\),对于每个 \(i\) 从 \(r\) 到 \(l+1\),令 \(a_i\gets a_i\oplus a_{i-1}\),所有操作完成后输出每个 \(a_i\),\(n\le3\times10^5\),\(m\le10^5\)
分析
以下假定 \(a_x=0\;(x\le 0)\)
先考虑第二种操作中 \(l=1\),\(r=n\) 的情况
考虑定期重构,设定阈值 \(B\)
设全局操作次数计数为 \(cnt\)
令 \(rbd(c)\) 表示令每个 \(a_i\) 变为全局操作 \(c\) 次后的值
对于操作一,令 \(cnt\gets cnt+1\),当 \(cnt=B\) 时,调用 \(rbd(cnt)\) 然后 \(cnt\gets 0\)
对于操作二,设查询位置为 \(x\),则此时值为
预处理所有 \(\binom xy\bmod 2\;(0\le x,y<B)\) 后可单次 \(O(B)\) 计算
考虑如何实现 \(rbd(c)\)
\(c=0\) 时直接返回
根据组合数相关性质,\(c\ne 0\) 时,令 \(k\) 为最大的正整数使得 \(2^k\le c\),则 \(rbd(c)\) 等价于先令 \(a_i\gets a_i\oplus a_{i-2^k}\),然后调用 \(rbd(c-2^k)\)
于是可以 \(O(n\log c)\) 实现一个 \(rbd(c)\)
总时间复杂度 \(O(mB+\frac mB\cdot n\log B)\),取 \(B=\sqrt{n\log n}\) 可做到 \(O(m\sqrt{n\log n})\),可过对应部分分
然后考虑一般情况
假设目前为止 \([l,r]\) 内的值是保证正确的,\([l,r]\) 以外的值不保证正确,则 \(k\) 次操作后,\([l-k,r]\) 内的值保证正确
考虑操作分块同时序列分块,\(S\) 次操作一起处理,再分为若干块依次处理
假设当前处理的序列块为 \([l,r]\),则为了保证 \(S\) 次操作后 \([l,r]\) 内值有效,必须保证 \(S\) 次操作前 \([\max(1,l-S),r]\) 内值有效
为了方便,可以令序列分块的块长也为 \(S\),这样只要将前一个块与当前块拼在一起处理,即可保证目前的 \(S\) 次操作结束后当前块内的值都是正确的
假设前一块为 \([L',R']\),当前块为 \([L,R]\),其中 \(R'=L-1\)
此时令 \(rbd(c)\) 为令 \(a_{L'\sim R}\) 为该区间操作 \(c\) 次后的结果,实现是类似的
对于操作一 \((l,r,x)\),若 \((l,r]\) 与 \([L',R]\) 无交则跳过,若 \((l,r]\supseteq [L',R]\) 则计数器 \(cnt\) 加一,否则先调用 \(rbd(cnt)\),令 \(cnt\gets 0\),然后暴力操作 \((l,r]\cap [L',R]\)
对于操作二,若查询的位置 \(x\) 在 \([L,R]\) 中则 \(rbd(cnt),cnt\gets 0\) 后令该询问的答案为 \(a_x\)
正确性显然
时间复杂度显然取决于 \(rbd\) 函数
单次 \(rbd\) 的时间复杂度为 \(O(S\log n)\)。每个操作二会带来一次 \(rbd\),总计 \(O(m)\) 次;每个操作一会带来 \(O(1)\) 次 \(rbd\),总计 \(O(m)\) 次;最终对于每个操作块中的序列块还要调用一次,总计 \(O(\frac nS\cdot\frac mS)\) 次
因此总时间复杂度 \(O(m+\frac nS\cdot\frac mS)\times O(S\log n)=O(m\log n(S+\frac nS))\),取 \(S=\sqrt n\) 可到 \(O(n\log n\sqrt n)\),由于 \(rbd\) 的常数较小可过
T3 P10004 [集训队互测 2023] Permutation Counting 2
题意
给定 \(n,M\),令 \(S_n\) 为长为 \(n\) 的排列的集合,令 \(\sigma'\) 表示排列 \(\sigma\) 的逆排列(\(\sigma'_{\sigma_i}=i\)),对于每个 \((x,y)\;(0\le x,y<n)\),求出
\(n\le500\),\(M\) 为充分大的质数
分析
令答案为 \(ans_{x,y}\;(x,y\in[0,n))\)
定义 \(i\) 为排列 \(\sigma_{1\sim n}\) 的上升位置当且仅当 \(1\le i<n\) 且 \(\sigma_i<\sigma_{i+1}\)
令 \(f_{i,j}\) 为在 \(\sigma\) 中选择恰好 \(i\) 个上升位置(即总数不小于 \(i\) 个),\(\sigma'\) 中选择恰好 \(j\) 个上升位置的方案数(排列相同选择位置不同为不同方案)(\(i,j\in[0,n)\))
显然 \(f_{i,j}=\sum_{a\ge i}\sum_{b\ge j}\binom ai\binom bjans_{a,b}\)
二项式反演得
问题转化为求出 \(f_{i,j}\)
类似地定义下降位置
排列有至少 \(k\) 个上升位置,等价于排列有至多 \(n-k-1\) 个下降位置,等价于排列有至多 \(n-k\) 个极长上升子段
在排列中选择 \(k\) 个上升位置,等价于在 \([1,n)\) 中选择 \(n-k-1\) 个位置且所有下降位置都被选择,等价于在 \([1,n]\) 中选择 \(n-k\) 个位置且所有非上升位置都被选择,等价于在 \([1,n]\) 中选择恰好 \(n-k\) 个位置且每个极长上升子段的第一个位置都被选择
令 \(g_{i,j}\) 表示在 \(\sigma\) 中选择恰好 \(i\) 个位置,满足其所有极长上升子段的第一个位置都被选择,在 \(\sigma'\) 中选择恰好 \(j\) 个位置,满足其所有极长上升子段的第一个位置都被选择 的方案数(\(i,j\in[1,n]\))
则 \(f_{i,j}=g_{n-i,n-j}\)
\(\sigma\) 的第 \(i\) 个极长上升连续段和 \(\sigma'\) 的第 \(j\) 个极长上升连续段的并为一个区间,构造一个矩阵 \(G\),\(G_{i,j}\) 表示该区间的长度
则一个 \(i\times j\) 的矩阵 \(G\) 唯一对应一个 \(\sigma\) 有 \(i\) 个极长上升连续段,\(\sigma'\) 有 \(j\) 个极长上升连续段的排列 \(\sigma_{1\sim n}\) 当且仅当 \(G\) 内数字总和为 \(n\),且 \(G\) 的每一行之和与每一列之和都不为 \(0\)
令 \(t_{i,j}\) 表示 \(i\times j\) 的矩阵数量满足矩阵中数字总和为 \(n\) 且每个位置非负,其等于将 \(n\) 划分为 \(ij\) 个自然数的方案数,即 \(t_{i,j}=\binom{n+ij-1}{ij-1}\)
根据矩阵的构造方式,其等于 在 \(\sigma\) 中选择不超过 \(i\) 个位置,满足其所有极长上升子段的第一个位置都被选择,在 \(\sigma'\) 中选择不超过 \(j\) 个位置,满足其所有极长上升子段的第一个位置都被选择 的方案数
显然 \(t_{i,j}=\sum_{a\le i}\binom ia\sum_{b\le j}\binom jb g_{a,b}\)
二项式反演得
综合所有式子得
每个 \(\sum\) 之间都是独立的,因此可以分步计算,总时间复杂度 \(O(n^3)\)
比赛结果
\(0+34+25\),\(\operatorname{rank}\) \(9\),最高分 \(100+33+50\)

浙公网安备 33010602011771号