1 条题解

  • 0
    @ 2026-6-19 10:30:17

    📝 题目大意

    给定六个非负整数 A,B,C,D,E,FA,B,C,D,E,F(每个 1018\le 10^{18}),满足 A×B×CD×E×FA \times B \times C \ge D \times E \times F。求 (A×B×C)(D×E×F)(A \times B \times C) - (D \times E \times F)998244353998244353 取模的结果。

    💡 解题思路

    1. 题目分析:每个输入数最大可达 101810^{18},三个数相乘可达 105410^{54},远超 64 位整数范围。因此不能直接计算乘积再取模,必须借助模运算性质,边乘边取模。同时,由于题目保证 A×B×CD×E×FA \times B \times C \ge D \times E \times F,真实差值非负,但模意义下 abcabc 可能小于 defdef,需要额外处理。

    2. 算法推导

      • 利用模运算性质:$(A \times B \times C) \bmod MOD = ((A \bmod MOD) \times (B \bmod MOD) \times (C \bmod MOD)) \bmod MOD$。
      • 但直接计算 A×BA \times B 仍可能溢出 long long1018×1018=103610^{18} \times 10^{18} = 10^{36}),因此使用 __int128 作为中间类型来承接两个 long long 的乘积。
      • 代码中 abc = (__int128)a * b % MOD * c % MOD 的执行顺序为:
        • 先将 a 转为 __int128,与 b 相乘(128 位不会溢出);
        • MOD 取模,结果回到 long long 范围;
        • 再与 c 相乘(此时两数都在 MOD 量级,乘积不会溢出 __int128);
        • 再对 MOD 取模,得到 A×B×CmodMODA \times B \times C \bmod MOD
      • 同理计算 def = (__int128)d * e % MOD * f % MOD
      • 最终结果:(abcdef+MOD)modMOD(abc - def + MOD) \bmod MOD,加 MOD 防止模运算下出现负数。
    3. 边界与细节

      • 输入可能为 00,处理方式与正常数一致,00 的模运算结果仍为 00
      • 必须使用 __int128(GCC/Clang 扩展),标准 C++ 的 long long 不足以安全承接两次 101810^{18} 级别的乘法。若环境不支持 __int128,可改用 unsigned long long 配合 ((a % MOD) * (b % MOD)) % MOD 的方法(因为 MOD < 2^31,两个小于 MOD 的数相乘不会溢出 long long)。
      • 虽然题目保证真实差值非负,但取模后 abcdef 的大小关系不确定,必须通过 + MOD 再取模来保证结果在 [0,MOD1][0, MOD-1] 范围内。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1) — 仅进行常数次乘法和取模运算。
    • 空间复杂度O(1)O(1) — 只使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    using namespace std;
    const long long MOD = 998244353;  // 模数
    int main() {
        long long a, b, c, d, e, f;
        cin >> a >> b >> c >> d >> e >> f;
        // 使用 __int128 作为中间类型,避免两个 10^18 级别数相乘溢出 long long
        // 先计算 a*b 并对 MOD 取模,再乘以 c 再取模,得到 (A*B*C) mod MOD
        __int128 abc = (__int128)a * b % MOD * c % MOD;
        // 同理计算 (D*E*F) mod MOD
        __int128 def = (__int128)d * e % MOD * f % MOD;
        // 输出 (abc - def) mod MOD,+MOD 保证结果非负
        cout << (long long)((abc - def + MOD) % MOD) << endl;
        return 0;
    }
    
    • 1

    信息

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