1 条题解

  • 0
    @ 2026-5-18 17:02:03

    A. FizzBuzz 变种版 详细题解

    题目理解

    我们需要统计在 [0,n][0, n] 范围内,有多少个整数 ii 满足:

    imod3=imod5i \bmod 3 = i \bmod 5

    关键观察

    • 00 总是满足条件,因为 0mod3=00 \bmod 3 = 00mod5=00 \bmod 5 = 0
    • 对于一般的 ii,我们要求两个余数相等。

    数学推导

    imod3=imod5=ri \bmod 3 = i \bmod 5 = r,其中 0r20 \le r \le 2(因为模 33 的余数只能是 0,1,20,1,2)。

    那么:

    ir(mod3)i \equiv r \pmod{3} ir(mod5)i \equiv r \pmod{5}

    这意味着:

    ir 能被 3 和 5 整除i - r \text{ 能被 } 3 \text{ 和 } 5 \text{ 整除} $$i - r \text{ 能被 } \mathrm{lcm}(3,5) = 15 \text{ 整除} $$

    所以:

    i=r+15k(k0)i = r + 15k \quad (k \ge 0)

    对于 r=0,1,2r = 0,1,2,我们得到三个等差数列:

    • r=0r = 00,15,30,45,0, 15, 30, 45, \dots
    • r=1r = 11,16,31,46,1, 16, 31, 46, \dots
    • r=2r = 22,17,32,47,2, 17, 32, 47, \dots

    结论

    1515 个连续整数中,恰好有 33 个满足条件(即 15k,15k+1,15k+215k, 15k+1, 15k+2,其中 k0k \ge 0)。


    计数公式

    q=n15q = \lfloor \frac{n}{15} \rfloorr=nmod15r = n \bmod 15(这里 rr 是余数,注意与上面的 rr 不同)。

    完整周期部分:

    0015q115q - 1,有 qq 个完整的长度为 1515 的区间,每个区间贡献 33 个满足条件的数。
    因此完整周期部分有 3q3q 个数。

    剩余部分:

    剩余部分是从 15q15qnn,共 r+1r+1 个数。
    我们需要检查这些数中哪些满足条件。

    这些数是:

    15q, 15q+1, 15q+2, , 15q+r15q,\ 15q+1,\ 15q+2,\ \dots,\ 15q+r

    因为 15qmod15=015q \bmod 15 = 0,所以:

    • 15q15q 对应 r=0r=0 的情况,满足条件
    • 15q+115q+1 对应 r=1r=1 的情况,满足条件
    • 15q+215q+2 对应 r=2r=2 的情况,满足条件
    • 15q+315q+3 对应 r=3r=3,但 3mod3=03 \bmod 3 = 03mod5=33 \bmod 5 = 3,不相等
    • 以此类推...

    实际上,我们只需要检查 j=0,1,,rj = 0,1,\dots,r 是否满足 jmod3=jmod5j \bmod 3 = j \bmod 5
    因为 15q+jj(mod3)15q + j \equiv j \pmod{3}j(mod5)\equiv j \pmod{5}

    最终公式:

    $$\text{ans} = 3 \times \left\lfloor \frac{n}{15} \right\rfloor + \text{count\_remainder}(n \bmod 15) $$

    其中 count_remainder(m)\text{count\_remainder}(m) 表示在 0,1,,m0,1,\dots,m 中满足 jmod3=jmod5j \bmod 3 = j \bmod 5 的个数。


    剩余部分查找表

    m=nmod15m = n \bmod 15mm001414

    mm 满足条件的 jj 个数
    0 1
    1 0,1 2
    2 0,1,2 3
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    观察发现,除了 m=0,1,2m=0,1,2 时有特殊情况,当 m2m \ge 2 时都是 33 个。
    实际上更精确地说:

    • 如果 m=0m=0:剩余部分有 {0}\{0\},共 11
    • 如果 m=1m=1:剩余部分有 {0,1}\{0,1\},共 22
    • 如果 m2m \ge 2:剩余部分包含 {0,1,2}\{0,1,2\},共 33

    但注意:当 m=2m=2 时,剩余部分就是 {0,1,2}\{0,1,2\},正好 33 个。

    所以:

    count_remainder(m)=min(m+1,3)\text{count\_remainder}(m) = \min(m+1, 3)

    更准确地说是 min(m,2)+1\min(m,2) + 1?我们验证:

    • m=0m=0min(0,2)+1=1\min(0,2)+1 = 1
    • m=1m=1min(1,2)+1=2\min(1,2)+1 = 2
    • m=2m=2min(2,2)+1=3\min(2,2)+1 = 3
    • m=3m=3min(3,2)+1=3\min(3,2)+1 = 3

    但注意 m=3m=3 时,剩余数是 {0,1,2,3}\{0,1,2,3\},其中 0,1,20,1,2 满足,33 不满足,共 33 个,公式成立。


    简化公式

    $$\text{ans} = 3 \times \left\lfloor \frac{n}{15} \right\rfloor + \min\left(n \bmod 15 + 1,\ 3\right) $$

    更简单的写法:

    $$\text{ans} = 3 \times \left\lfloor \frac{n}{15} \right\rfloor + \min( (n \bmod 15) + 1,\ 3) $$

    等价地:

    $$\text{ans} = 3 \times \left\lfloor \frac{n}{15} \right\rfloor + \min( n \bmod 15,\ 2) + 1 $$

    因为 min(m+1,3)=min(m,2)+1\min(m+1,3) = \min(m,2) + 1


    标程验证

    给定的 Python 代码:

    t = int(input())
    for i in range(t):
        n = int(input())
        ans = 3 * (n // 15)
        n %= 15
        for j in range(n + 1):
            if j % 3 == j % 5:
                ans += 1
        print(ans)
    

    这个代码:

    1. 先计算完整周期数 3×n/153 \times \lfloor n/15 \rfloor
    2. 然后对剩余部分 00n%15n \% 15 逐个判断,累加满足条件的个数
    3. 复杂度 O(t×15)O(t \times 15),完全可行

    复杂度分析

    • 每个测试用例 O(1)O(1) 计算(若用公式)
    • 总时间复杂度 O(t)O(t),可以轻松处理 t104t \le 10^4

    最终公式代码实现(C++)

    #include <iostream>
    using namespace std;
    
    int main() {
        int t;
        cin >> t;
        
        while (t--) {
            long long n;
            cin >> n;
            
            long long ans = 3 * (n / 15) + min(n % 15 + 1, 3LL);
            // 等价写法: ans = 3 * (n / 15) + min(n % 15, 2) + 1;
            
            cout << ans << endl;
        }
        
        return 0;
    }
    

    验证示例

    n=15n=15 为例:

    • 15/15=115/15 = 1,完整周期贡献 3×1=33 \times 1 = 3
    • 15%15=015 \% 15 = 0min(0+1,3)=1\min(0+1,3)=1
    • 总答案 3+1=43+1=4,匹配输出

    n=5n=5 为例:

    • 5/15=05/15 = 0,贡献 00
    • 5%15=55 \% 15 = 5min(5+1,3)=3\min(5+1,3)=3
    • 总答案 33,匹配输出 {0,1,2}\{0,1,2\}

    n=0n=0 为例:

    • 0/15=00/15 = 0,贡献 00
    • 0%15=00 \% 15 = 0min(0+1,3)=1\min(0+1,3)=1
    • 总答案 11,匹配输出 {0}\{0\}

    总结

    核心思想是发现 imod3=imod5i \bmod 3 = i \bmod 5 当且仅当 i0,1,2(mod15)i \equiv 0,1,2 \pmod{15},然后利用周期性快速计数,避免 O(n)O(n) 的逐个判断。

    • 1

    信息

    ID
    7208
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者