1 条题解

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

    📝 题目大意

    给定一个整数 NN1018N1018-10^{18} \leq N \leq 10^{18}),求满足 0x<9982443530 \leq x < 998244353NxN - x998244353998244353 的倍数的唯一整数 xx。本质上就是求 NN998244353998244353 取模的非负余数。

    💡 解题思路

    1. 题目分析:条件 NxN - x998244353998244353 的倍数,等价于 Nx(mod998244353)N \equiv x \pmod{998244353}。因此 xx 就是 NN 除以 998244353998244353 的余数,且要求 0x<9982443530 \leq x < 998244353。数据范围 N1018|N| \leq 10^{18},在 long long 范围内,直接取模即可。

    2. 算法推导

      • mod = 998244353
      • 先计算 n % mod,得到 NN 除以 mod 的余数。
      • 在 C++ 中,当 NN 为负数时,n % mod 的结果也是负数(或零)。例如 10mod3=1-10 \bmod 3 = -1
      • 因此,如果 n % mod < 0,需要加上 mod 将其调整到 [0,mod1][0, mod-1] 范围内。
      • 最终输出调整后的 n 即可。
    3. 边界与细节

      • NN 恰好是 mod 的倍数时(包括 N=0N = 0),n % mod == 0,无需调整,直接输出 00
      • NN 为负数且绝对值很大时(如样例 2 的 9982443534-9982443534),取模后为负,加上 mod 即可得到正确的非负余数。
      • 注意 mod = 998244353int 范围内,但 NN 可达 101810^{18},需要使用 long long

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅一次取模和一次条件判断。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #pragma GCC optimize("O3")
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    #define double long double
    const int mod = 998244353;  // 模数
    signed main(){
        int n;
        cin >> n;
        n %= mod;               // 先取模,C++ 中负数取模结果可能为负
        if(n < 0)               // 如果余数为负,加上 mod 调整到非负范围
            n += mod;
        cout << n << '\n';      // 输出 [0, mod-1] 范围内的答案
    }
    
    • 1

    信息

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