1 条题解

  • 0
    @ 2025-8-24 22:36:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar unputdownable
    下雨不是任何人的错。

    搬运于2025-08-24 22:36:40,当前版本为作者最后更新于2022-02-26 22:38:03,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    考虑如何求出 Jm(n)J_m(n)

    递归,如果 n<mn < mJm(n)=1J_m(n)=1

    如果 nmn \geq m,考虑报一遍 1m1-m

    TK7ZSe.png

    所以有:

    $$J_m(n)=\begin{cases}1 & J_m(n-m+1)=n-m+1\\J_m(n-m+1)+m & \text{else}\end{cases} $$

    于是可以将 nn 按模 m1m-1 分类,这样在每一类中,除了若干个 Jm(n)=nJ_m(n)=n 的位置外,都是公差为 mm 的等差数列。


    考虑每一类中有哪些不满足等差的位置(下称断点)。

    由于 Jm(n)=nJ_m(n)=n 的下一项必然是 11,所以一个 11 对应一个断点。

    思考 Jm(n)J_m(n) 什么情况下为 11

    上面提过 1n<m1 \leq n < m 的时候是 11

    nmn \geq m 时,易得 nn 必然是 mm 的倍数,否则报完一圈后 11 一定当场出局,于是除 mm 后归纳。

    可得断点只有 k×mak \times m^a 的形式,其中 1km11 \leq k \leq m-1

    那么每个同余类中就只有 log\log 个断点(k×mak \times m^a 正好在 kk 这个同余类中),拆成 log\log 个等差数列分别求和即可。

    这样就得到了一个 Θ(mlogma)\Theta(m\log_m a) 的算法。

    对于每一个 ii 暴力找出其前面最后一个断点,就能得到一个 Θ(logma)\Theta(\log_m a) 的单点求值算法。

    两者结合起来可以得到 5555 分的好成绩。


    继续观察第 kk 组的答案。

    事实上断点是 k×mak \times m^a 的形式,而点的个数是 nkm1+1\lfloor \frac{n-k}{m-1}+1 \rfloor

    只要断点的个数相同,并且点的个数相同,那么可以发现答案就是关于 kk 的不超过 22 次的多项式。而断点个数和点的个数都只有两种,所以按这个把要算的东西分成三段,对每一段插值算即可。

    时间复杂度 Θ(logma)\Theta(\log_m a)

    • 1

    信息

    ID
    7356
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者