1 条题解

  • 0
    @ 2025-8-24 21:17:03

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:17:02,当前版本为作者最后更新于2025-03-05 11:12:32,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    要解决这个问题,我们需要找到隐藏的数学规律。首先回忆一个基本定理:一个数能被 33 整除,当且仅当它的各位数字之和能被 33 整除。这是解题的重要突破口。

    接下来观察拼接数的特性。比如第 kk123k123\dots k 的各位和,其实等于 11kk 每个数字的各位和之和。有趣的是,对于多位数来说,其本身和它的各位和在对 33 取模时结果相同(因为 1010 的任何次方对 33 取余都是 11)。这就将问题转化为研究 11kk 的总和对 33 取模的情况。

    定义数列第 kk 项的各位和是 S(k)S(k),则有 S(k)=1+2++k=k(k+1)2S(k) = 1+2+\dots+k = \dfrac{k(k+1)}{2}

    判断条件转化为:k(k+1)2\dfrac{k(k+1)}{2}33 除,余数是否为 00

    接下来我们可以进行等价转换。两边同乘 22(这在模 33 运算下是允许的),得到若 k(k+1)k(k+1)33 除,余数为 00,则计入答案。

    这时有一个关键性结论:任意两个连续整数中必然得要有一个是 33 的倍数。通过分析 kk 的不同余数情况:

    • kmod3=0k\bmod 3=0 时:kk 本身是 33 的倍数;
    • kmod2=0k\bmod 2=0 时:k+1k+1 变为 33 的倍数;
    • kmod1=0k\bmod 1=0 时:两者均不被 33 整除;

    由此得出结论:当且仅当 kmod3k\bmod 3 等于 0022 时,对应的拼接数能被 33 整除。最后我们需要做的,就是在 11nn 的范围内统计满足这两个条件的数的个数。

    统计方法为:

    • 满足 kmod3=0k \bmod 3=0 的个数为:n/3\lfloor n/3 \rfloor\lfloor \rfloor 表示下取整,例如 3.14=3\lfloor 3.14 \rfloor=3)。
    • 满足 kmod3=2k \bmod 3=2 的个数为:(n+1)/3\lfloor (n+1)/3\rfloor

    因此,答案为

    $$\text{ans} = \lfloor n/3 \rfloor + \lfloor (n+1)/3 \rfloor $$

    参考代码(只展示关键部分):

    int cnt0 = n / 3;        // k 能被 3 整除的个数,例如 3, 6, 9, ...
    int cnt2 = (n + 1) / 3;    // k mod 3 等于 2 的个数,例如 2, 5, 8, ...    
    int ans = cnt0 + cnt2;     // 两部分之和就是答案
    cout << ans << endl;
    
    • 1

    信息

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