2026.7.25 模拟赛

https://oj.gxyzh.com/d/hzoj/contest/6a63fd34ee9cc46434e73688

T1 T2 T3 T4
实际得分 100 0 30 10
期望得分 100 0 30 10
能力得分 100 100 30 40

T1 是简单的乱搞题,T2 是树上背包,T3 是数论+数据结构,T4 是【?】.

修改进制

需要一些人类智慧以及丁真能力.

题目要求:

\[d=\sum_{i=1}^{n}e_ib_i \]

其中 \(e_i=0/1\).

拆开 \(b_i\),将 \(P\) 除过去有:

\[\frac{d}{P}=\sum_{i=1}^n e_i\frac{1}{a_i} \]

注意,这里有一条关键的信息:\(a_i\) 为互不相同的质数.

考虑将等式两侧化成最简分数的形式,那么右侧的分母为:

\[\prod _{i=1}^n e_ia_i \]

显然两侧的分母必然相同,将 \(d\)\(P\) 进行约分,得到右侧的分母.

得到了 \(e_i\),直接验证即可..

这里验证有三种方式:

第一种是头铁的人的做法,第二种是正常人的做法,第三种是我的做法.

  1. 使用高精度模拟.
    因为 \(n\le 10^3\),因此可以直接模拟,实现高精加/乘即可.

  2. 使用哈希:具体地,选取几个大素数,计算等式两侧在模意义下的值,进行验证即可.
    甚至你可以借鉴 Hash Killer III 的思想,选取随机模数,这样便无懈可击.

  3. 使用 double 类型直接模拟等式两侧.
    表面上会炸精度,但实际上由于 \(a_i\le 10^9\),因此等式右侧数量级在 \(10^{-9}\)\(10^{0}\) 之间,double 完全可以进行计算.
    对于等式左边,需要一些手法:可以通过乘一个,再除一个,这样能减少误差.

寻找小猫

场上有些降智,没有做出来(事实上本人对树上背包不太熟悉,截止 2026.7 还没有改省选 Day1 T1).

场后看这道题其实还是比较简单的.

由于发现花费时间与搜查叶子个数紧密相关,因此要在设计 DP 状态是加入对搜查叶子个数的记录.

手模样例一,可以发现,搜查小猫可以通过排除法,但是我们发现只能有一个子树使用排除法,因此在设计状态时加入可否使用排除法.

因此有 \(dp_{u,k,0/1}\) 表示在子树 \(u\) 中,选取 \(k\) 个叶子搜查,可否使用排除法,排除搜查叶子以外的最小代价.

于是有转移:

\[dp_{u,k,0}=\min(\sum_{\sum k_i=k}dp_{s_i,k_i,0},a_u+\sum_{\sum k_i=k}\min(dp_{s_i,k_i,0/1})) \]

\[dp_{u,k,1}=\min(\sum_{\sum k_i=k}dp_{s_i,k_i,0/1})(只有一个 DP 状态为 1) \]

场上思考第二种转移,不知道如何实现,实际上就是一个二维背包.

最终答案需要加上搜查叶子的代价.

平方操作

最朴素的暴力可以拿到 20 分,特殊性质 A 可以拿到 10 分.

首先需要丁真 \(998244353\) 这个素数,考虑 \(a\) 模意义下的逆元,其实就是 \(a^{p-2}\).

于是我们可以得到:

\[\frac{1}{a^2}\equiv (a^2)^{p-2}\equiv (a^{p-2})^2\equiv (\frac 1a)^2\pmod p \]

因此只需要在最开始求一遍逆元,问题就转化成了区间平方,区间求和.

记操作次数为 \(k\),则我们要求的就是 \(a^{2^k}\) 在模 \(p\) 意义下的值,由于扩展欧拉定理:

\[a^{k}\equiv a^{k\bmod \varphi (p)}\pmod p \]

因此考虑 \(2^k\bmod 998244352\).

场上考虑过 \(2^k\) 是否会造成循环,但是当时认为由于 \(2\)\(998244352\) 不互质,没有进一步考虑.

我的OI数论物语果然有问题

如果你学过 NTT 的话,发现 \(998244353\) 这个模数真的是太熟悉了:

\[998244352 = 7\times 17 \times 2^{23} \]

由于同余式的结论:

\[ad\equiv bd\pmod{cd}\Leftrightarrow a\equiv b\pmod c \]

由于:

\[2^{k}\equiv 2^{k-\varphi(119)}\pmod {119} \]

因此:

\[2^{k}\times 2^{23}\equiv 2^{k-\varphi(119)}\times 2^{23}\pmod {998244352} \]

即当 \(k\ge 23\) 时,有:

\[2^k\equiv 2^{k+\varphi(119)}\pmod {998244342} \]

但是 \(\varphi (119)=96\),事实上可以更小:

注意到:\(2^{24}\equiv 1\pmod {119}\),因此:

\[2^{k}\equiv 2^{k+24}\pmod {998244352} \]

总结一下:在 \(k\le 22\) 时,\(2^k\) 是独特的;在 \(k\ge 23\) 时,\(2^{k}\) 具有循环性质,循环节为 \(24\).

这时便能上数据结构维护了:

  1. 情况一,由于 \(k\le 22\),因此可以使用势能线段树维护.
    由于这个势能线段树需要与情况二对接,因此这对于经常封装线段树的同学不太友好,
    因此本人采用并查集+树状数组维护,理论常数更小.
  2. 情况二,由于有 \(24\) 的循环节,因此可以将 \(24\) 种取值进行记录,修改时直接换成下一个值.

理论上的常数为 \(22+24\),但其实很大程度跑不满.

posted @ 2026-07-26 19:16  zhoumengxuan  阅读(3)  评论(0)    收藏  举报