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\),则此时值为

\[\bigoplus_{i=0}^{cnt}\left[\binom{cnt}i\equiv1\bmod 2\right]a_{x-i} \]

预处理所有 \(\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)\),求出

\[\sum_{\sigma\in S_n}\left[\sum_{i=1}^{n-1}[\sigma_i<\sigma_{i+1}]=x\right]\left[\sum_{i=1}^{n-1}[\sigma'_i<\sigma'_{i+1}]=y\right]\bmod M \]

\(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}\)

二项式反演得

\[ans_{i,j}=\sum_{a\ge i}(-1)^{a+i}\binom ai\sum_{b\ge j}(-1)^{b+j}\binom bj f_{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}\)

二项式反演得

\[g_{i,j}=\sum_{a\le i}(-1)^{a+i}\binom ia\sum_{b\le j}(-1)^{b+j}\binom jb t_{a,b} \]

综合所有式子得

\[ans_{i,j}=\sum_{a\ge i}(-1)^{a+i}\binom ai\sum_{b\ge j}(-1)^{b+j}\binom bj f_{a,b}\\ f_{i,j}=g_{n-i,n-j}\\ g_{i,j}=\sum_{a\le i}(-1)^{a+i}\binom ia\sum_{b\le j}(-1)^{b+j}\binom jb t_{a,b}\\ 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\)

posted @ 2025-02-27 20:14  Hstry  阅读(24)  评论(0)    收藏  举报