1 条题解

  • 0
    @ 2026-6-19 10:31:05

    📝 题目大意

    给定三个正整数 A,B,CA, B, C,求 a=1Ab=1Bc=1Cabc\sum_{a=1}^{A}\sum_{b=1}^{B}\sum_{c=1}^{C} abc998244353998244353 取模的结果。

    💡 解题思路

    1. 题目分析:三重求和中的每一项是 abcabc,而 a,b,ca, b, c 各自独立遍历 [1,A][1, A][1,B][1, B][1,C][1, C]。由于三个求和变量互不依赖,三重求和可以因式分解为三个独立求和式的乘积。数据范围 A,B,C109A, B, C \leq 10^9,直接三层循环不可行,必须用数学公式 O(1)O(1) 计算。

    2. 算法推导

      • 朴素想法是三重循环,但 10910^9 级别必然超时。
      • 观察求和式:$$\sum_{a=1}^{A}\sum_{b=1}^{B}\sum_{c=1}^{C} abc = \left(\sum_{a=1}^{A} a\right) \cdot \left(\sum_{b=1}^{B} b\right) \cdot \left(\sum_{c=1}^{C} c\right)$$这是因为 abcabcaa 只与 AA 有关、bb 只与 BB 有关、cc 只与 CC 有关,三者可以独立求和再相乘。
      • 每个单变量求和是等差数列求和:i=1ni=n(n+1)2\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
      • 因此答案为:$$\frac{A(A+1)}{2} \cdot \frac{B(B+1)}{2} \cdot \frac{C(C+1)}{2} \pmod{998244353}$$
      • 代码实现:先分别计算 SA=A(A+1)2modMS_A = \frac{A(A+1)}{2} \bmod MSB=B(B+1)2modMS_B = \frac{B(B+1)}{2} \bmod MSC=C(C+1)2modMS_C = \frac{C(C+1)}{2} \bmod M,再将三者相乘取模。由于 n(n+1)n(n+1) 必为偶数,整数除法 n(n+1)2\frac{n(n+1)}{2}long long 下不会丢失精度,取模后再乘也不会溢出。
    3. 边界与细节

      • A,B,CA, B, C 最大可达 10910^9n(n+1)n(n+1) 约为 101810^{18},在 long long2639.2×10182^{63} \approx 9.2 \times 10^{18})范围内,不会溢出;但若用 int 会溢出,务必使用 long long
      • 模数 998244353998244353 不是常规的 109+710^9+7,注意不要写错。
      • 三项相乘时 (a×bmodM)×cmodM(a \times b \bmod M) \times c \bmod M 每步都要取模,避免中间值溢出 long longM31027M^3 \approx 10^{27},远超 long long 范围)。
      • A,B,CA, B, C 中任意一个为 00 时(虽然题目说是正整数,但严谨起见),S=0S = 0,最终答案为 00

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1)。仅进行三次等差数列求和与三次模乘运算,与输入规模无关。
    • 空间复杂度O(1)O(1)。仅使用常数个变量 a, b, c 和常量 mod,无额外数组或递归。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    long long a, b, c;                     // 使用 long long 防止溢出
    const int mod = 998244353;             // 题目指定的模数,注意不是 1e9+7
    
    int main() {
        cin >> a >> b >> c;
        // 计算等差数列和 S_A = A*(A+1)/2,并取模
        // 注意:1ll 强制转为 long long 防止溢出;n*(n+1) 必为偶数,整除安全
        a = (1ll + a) * a / 2 % mod;
        b = (b + 1ll) * b / 2 % mod;
        c = (c + 1ll) * c / 2 % mod;
        // 三重求和因式分解为三个独立和的乘积,每步取模防止溢出
        cout << ((a * b % mod) * c) % mod;
        return 0;
    }
    
    • 1

    信息

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