2025.9.24 NOIP 模拟赛 题解

比赛

订正

T1 G1044 T1 集合论

题意

给定 \(n\),求出有多少 \([1,n]\cap \mathbb N\) 的非空子集,满足 \(\gcd\)\(1\)\(\text{lcm}\)\(n\)\(n\le10^{14}\)

分析

\(f_i\) 表示 \([1,i]\cap\mathbb N\) 的子集数量满足 \(\text{lcm}\)\(i\) 的因子,显然 \(f_i=2^{d(i)}-1\),其中 \(d(i)\) 表示 \(i\) 的因子数量

\(g_i\) 表示 \([1,i]\cap\mathbb N\) 的子集数量满足 \(\text{lcm}\) 等于 \(i\),显然 \(f_i=\sum_{j\mid i}g_j\),即 \(f=g\ast I\),从而 \(g=f\ast\mu\)

对于每种选择的方案,令所有数字除以总的 \(\gcd\),则 \(g_i\) 同样表示 \([1,i]\cap\mathbb N\) 的子集数量满足 \(\gcd\) 等于 \(1\)\(\text{lcm}\)\(i\) 的因子

\(h_i\) 表示 \([1,i]\cap\mathbb N\) 的子集数量满足 \(\text{lcm}\) 等于 \(i\)\(\gcd\) 等于 \(1\),显然 \(g=h\ast I\),从而 \(h=g\ast\mu=f\ast\mu\ast \mu\)

答案为 \(h_n\),等于

\[\begin{aligned} &\prod_{abc=n}\mu_a\mu_bf_c\\ =&\prod_{abc=n}\mu_a\mu_b92^{d(c)}-1)\\ \end{aligned} \]

容易做到 \(O((d(n))^2)\)

\(10^{14}\) 以内 \(d\) 大约在 \(15000\) 左右,常数优秀的实现足够通过

代码

T2 G1045 T2 建造

题意

给定 \(n,x,M\),求出有多少种 \((a,p)\),其中 \(a\) 长度 \(n\) 且严格递增且 \(1\le a_1<a_n\le x\)\(p\) 为长度 \(n\) 的排列,满足 \(\forall 1\le i<n,a_{i+1}-a_i\ge \max(p_{i+1},p_i)\),方案数对 \(M\) 取模,\(n\le100,x\le10^5\)\(M\) 为充分大的质数

分析

考虑连续段 \(dp\)

\(1\)\(n\) 依次将值插入,令 \(f_{i,j,k}\) 表示插入了 \(1\sim i\),存在 \(j\) 个空隙(即 \(j+1\) 段),且每段中 \(\sum \max(p_{i+1},p_i)\) 的总和为 \(k\) 的方案数

初始 \(f_{1,0,0}=1\)

\(f_{i,j,k}\) 的转移为:

  • \(f_{i,j+1,k}\gets 2f_{i,j,k}\)(新增一段且放到边沿)
  • \(f_{i,j,k+i}\gets 2f_{i,j,k}\)(放在最左侧且连向第一段或放在最右侧且连向最后一段)
  • \(f_{i,j+1,k}\gets jf_{i,j,k}\)(新增一段并放在某个空隙中)
  • \(f_{i,j,k+i}\gets 2jf_{i,j,k}\)(放在某个空隙中,并连向一侧)
  • \(f_{i,j-1,k+2i}\gets jf_{i,j,k}\)(放在某个空隙中,并连向两侧)

答案为 \(\sum_w f_{n,0,w} S(x-w-1,n+1)\),其中 \(S(n,m)\) 表示把 \(n\) 划分为 \(m\) 个自然数的方案数

时间复杂度 \(O(n^4+x)\)

代码

T3 G1046 T3 魔法

题意

给定一棵树,初始边权都是 \(1\)\(q\) 次询问,每次给定 \(k\),要进行 \(k\) 次操作,每次都选择一条边长度加一,求最终可能得到的树中直径的最小值,\(n,q\le2\times10^5,k\le10^{18}\)

分析

每条边中间放置一个点,则不需要考虑直径中心在边上的情况,每次操作转化为选择一条边长度加二,答案为树最小直径的一半

取点 \(u\) 为重心时,令 \(clf\) 为叶子数量,\(mxd_u\) 为距离 \(u\) 最远的点的距离,\(s_u\) 为所有叶子到 \(u\) 的距离之和,容易换根 \(dp\) 求出

则一次询问 \(t\) 的答案为

\[\min_{u=1}^n \left(2\left\lceil\frac{\max(0,t-\lceil\frac{mxd_u\times clf-s_u}2\rceil)}{clf}\right\rceil+mxd_u\right) \]

每个 \(u\) 的函数图像都是左侧水平,右侧不降,且近似于一条斜率为 \(\frac1{clf}\) 的直线

将图像从 \(t=\lceil\frac{mxd_u\times clf-s_u}2\rceil\) 的位置划分为左右两部分

先考虑水平部分,显然相当于若干区间取 \(\min\),容易做到 \(O((n+q)\log V)\)\(O((n+q)\log n)\)

然后考虑右侧,将 \(u\)\(mxd_u\) 的奇偶性分为两类,若在某范围内若干右侧部分都有效,则可以从中选出一个使得整个范围内都是它最优,因此将值域分为 \(O(n)\) 段后预处理每段内取到最优的,容易做到时间复杂度 \(O((n+q)\log n)\)

总时间复杂度 \(O((n+q)\log n)\)

代码

T4 G1047 T4 接力游戏

题意

\(0\sim n+1\)\(0\sim n\) 每个点有权值 \(w_i\),初始都是 \(0\),有 \(f_{1\sim n},a_{1\sim n}\),从 \(0\) 出发,若当前点点权为 \(0\) 则走到 \(i+a_i\),若为 \(1\) 则走到 \(f_i\),并将走到的点的权值取反,强制令 \(0\) 的点权为 \(0\),求到达 \(n+1\) 时总移动次数,答案对一充分大质数取模,\(n\le2000,a_i\in\{1,2\},S=\sum_i[a_i=2]\le 19,0\le f_i<i\)

分析

假定 \(a_0=1\)

\(x_i\) 表示点 \(i\) 经过的次数,显然 \(x_{n+1}=1\),答案为 \(\sum_{i=0}^n x_i\),有若干限制形如:

\[x_i=\sum_{f_j=i}\left\lceil\frac{x_j}2\right\rceil+\sum_{j+a_j=i}\left\lfloor\frac{x_j}2\right\rfloor+[i=0] \]

\(p_i=x_i\bmod 2\),则有

\[x_i=\sum_{f_j=i}\frac{x_j+p_j}2+\sum_{j+a_j=i}\frac{x_j-p_j}2+[i=0] \]

\(a_i=1\) 时,显然 \(p_{i+1}\) 必然为 \(0\)

因此有效的 \(p\) 的数量为 \(O(S)\)

考虑将所有 \(x_i\)\(p\) 表示,枚举 \(O(2^S)\) 种可能的 \(p\),每种 \(p\) 依次枚举 \(x_{1\sim n}\),求出对应值,若奇偶性与 \(p\) 不同则跳过当前的 \(p\),应该可以证明不合法的 \(p\) 在前 \(O(1)\)\(x\) 中被跳过,因此时间复杂度 \(O((2^S+n)S)\)

考虑如何处理将 \(x_i\)\(p\) 表示的这一步

先得到 \(O(n)\)\(\sum_{i=0}^{n+1} a_i x_i+\sum_{i\in K} b_ip_i=0\)(因为 \(x_{n+1}=1\) 因此可以省略常数,\(K\) 表示有效的 \(p\) 的位置的集合),显然 \(a\) 不全为 \(0\),取出最小的 \(x\) 使得 \(a_x\ne 0\),则可用 \(x_{x+1\sim n+1}\)\(p\) 表示出 \(x_i\)

一个 \(x_i\) 无法这样表出当且仅当 \(a_{i-1}=2,a_i=1\),数量为 \(O(S)\) 的,它们单独高斯消元做到 \(O(S^3)\),再带回求出其他 \(x\) 的系数做到 \(O(nS)\),这部分时间复杂度 \(O(S^3+nS)\)

总时间复杂度 \(O(S^3+nS+(2^S+n)S)=O(S2^S+nS)\)

注意到存在一个问题:高斯消元过程中 \(x\) 对大质数取模后无法得知奇偶性

一种方式为使用高精度,显然位数不超过 \(O(n)\),应该可以做到 \(O(n^\omega(S2^S+nS))\),其中 \(\omega\)\(1\)\(2\)(不知能否避免高精度乘法)

另一种方式为使用 \(\text{CRT}\),取 \(100\)\(10^9\) 左右的质数分别进行上述过程,用 \(\text{CRT}\) 合并时维护 \(2\) 的因子数量,当分母为 \(0\) 时应忽略之,时间复杂度 \(O(k(S2^S+nS))\),其中 \(k=100\)

代码

比赛结果

\(100+100+50+0\)\(\text{rk}17\)

posted @ 2025-09-29 18:53  Hstry  阅读(60)  评论(0)    收藏  举报