7.6
简单写点省队集训考试题和讲课的题。
T2 UOJ427 化学竞赛
给定一个大小为 \(n\) 的阿贝尔群,再给定一个序列 \(a_m\),其中每个元素都在群中,\(q\) 次询问一个区间内的数的生成群大小。\(n \leq 3\times 10^3,m,q \leq 1 \times 10^6\)
一个结论是 Abel 群可以被直积分解成若干个循环群,即如果 \(n=p_1^{q_1}p_2^{q_2}\cdots p_c^{q_c}\),那么 \(S=\mathbb{Z}_{p_1^{q_1}}\times \cdots \times \mathbb{Z}_{p_c^{q_c}}\),这个证明以后补一下,读抽代的时候没仔细看。
然后就是 OI 内容了,考察所有 \(q\) 为 1 怎么做,不难发现这时候一个向量(我们把数分解掉)的生成群阶数其实就是它所有有数的位上的 \(p\) 的积,这个还是比较显然的,因为所有 \(\gcd\) 都是 1,所以我们就不用管太多东西,只要考虑哪些位上有数。
接着问题转化为求区间并的位数,但是 \(p\) 只有 \(\log\) 种,扫描线 \(l\),维护一些 \(r\) 使得这些 \(r\) 相较于前面答案发生了变化,这个只有 \(\log\) 种,而且每次操作 \(r\) 集合的变化是 \(O(1)\) 的,二分修改一下就是第一个 \(\log\) 。
\(q\) 不是 1 呢?这时候每位上就不一定是 1 或者 0,但是我们发现把它扩充到 \(q\) 就还能沿用上述做法,且较小数一定比大数优,把并换成线性基就可以做到两个 \(\log\)。
T3 UOJ705 黄忠庆功宴
给定一个大小为 \(p\) 的环,\(q\) 次询问每次从环上 \(x\) 点跳 \(l\) 步每步跳 \(k\) 个间隔,路上所有点 \(a\) 加起来是多少。\(p\) 是质数,\(p,q \leq 3 \times 10^5\)。
暴力做法:断环成链,然后暴力跳。这个做法能扩展到 \(k\) 比较小的情况,但是比较大比较无能为力,这启发我们根号分治,但是我们其实并没有什么比较好的做法。
还有一个思路:发现走到边界返回开头这个过程是比较关键也是我们不好处理的,我们能不能尽量把这部分简单化?
两部分殊途同归,有两个做法:
第一个是考虑我们在走 \(k^{-1}\) 后等价往前走了一格,然后剩下的部分相当于是前面部分到的点全部 \(+1\) ,我们就把原序列划分成了 \(k^{-1}\) 个公差是 1 的等差数列,如果 \(k^{-1}\) 很小,我们直接暴力找到这个等差数列,然后算一算就做完了。
但是这两部分还是没办法平衡,\(k\) 和 \(k^{-1}\) 没有必然联系,这时候有个惊人的观察,就是每个 \(k\) 必然存在一个分解使得 \(k=\frac{a}{b}\) 使得两个数都是根号级别的,证明可以考虑所有 \({a-bk}\) 中必然有重复(鸽笼),然后大的减一下就有了,有了这个结论之后我们就预处理所有 \(a\) 的对应等差数列,问题转化成每次在对应 \(a\) 处理出来的序列上走 \(b^{-1}\) 个格子,然后就运用上面做法解决。
其实这个做法的本质还应该是考虑 \(k\) 怎么缩小或者分解成若干个子部分,这样能比较好做,然后你按照每次一步走小于根号所有预处理出来,一次走 \(k\) 也存在一个分解在预处理的上面走的步数不多,然后能按照上述方法处理。
但是这个还是很严格,还是太抽象了,于是有方法二:考虑每次我们不走到初始点加一,而是放宽限制,到加小于根号,这个可以发现如果你一次迈过的间隔大于根号,那必然在根号步内能到,证明是类似的,考虑集合 \(ay\),\(y\) 是你一次迈的间隔,只要有两个的差小于根号那就有解,否则是一个平铺之类的东西,也就不合法。
然后这个就跟上面差不多了,分成根号个公差根号的等差数列,预处理即可,这个的本质也差不多是把等差数列作小的划分,殊途同归。