1 条题解

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

    📝 题目大意

    给定整数 NN2N1052 \leq N \leq 10^5),在所有满足 a+b=Na + b = N 的正整数对 (a,b)(a, b) 中,求 aa 的各位数字之和与 bb 的各位数字之和的最小值。

    💡 解题思路

    1. 题目分析:核心是十进制加法中进位与数字和的关系。设 S(x)S(x) 表示 xx 的十进制各位数字之和。两个数相加时,每发生一次进位,总数字和会减少 99(因为 1010 进到高位变成 11,净损失 99)。因此有恒等式:

      S(a)+S(b)=S(N)+9×cS(a) + S(b) = S(N) + 9 \times c

      其中 cca+ba+b 过程中产生的进位次数。要最小化 S(a)+S(b)S(a) + S(b),等价于最小化进位次数 cc

    2. 算法推导

      • 理想情况:零进位。如果能够构造一对 (a,b)(a, b) 使得加法过程中不发生任何进位,则 S(a)+S(b)=S(N)S(a) + S(b) = S(N),这是理论下界。对于绝大多数 NN,这是可以做到的:只需将 NN 的每一位数字 did_i 拆分为 xi+yi=dix_i + y_i = d_ixi,yi0x_i, y_i \ge 0),并保证 aabb 各自至少有一位非零(即 a,ba, b 均为正数)。例如 N=15N=15a=10,b=5a=10, b=5S(10)+S(5)=1+5=6=S(15)S(10)+S(5)=1+5=6=S(15)
      • 特殊情况:S(N)=1S(N)=1。此时 NN1010 的幂(如 10,100,1000,10, 100, 1000, \dots),其十进制表示仅有一个 11 后面跟若干 00。由于只有一位非零数字且为 11,无论怎么拆分,都无法让 aabb 同时为正且不进位——若把 11 分给 aabb 全为 00b=0b=0 不合法。因此至少需要发生一次进位,S(a)+S(b)=S(N)+9×1=10S(a)+S(b)=S(N)+9 \times 1 = 10
      • 结论:先计算 NN 的数字和 ans,若 ans == 1 则输出 10,否则直接输出 ans
    3. 边界与细节

      • N=2N=2 时数字和为 22a=1,b=1a=1,b=1 即得答案 22,正确。
      • N=10kN=10^k 时输出 1010,如样例 N=100000N=100000 输出 1010
      • 数据范围 N105N \le 10^5int 足够,无溢出风险。

    ⏱️ 复杂度分析

    • 时间复杂度O(log10N)O(\log_{10} N),即 NN 的十进制位数,每次循环提取一位数字。对于 N105N \le 10^5,最多 66 次迭代。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n, a[100000], ans = 0;  // ans 累加各位数字和
        cin >> n;
        while (n) {
            ans += n % 10;          // 取最低位数字累加
            n /= 10;                // 去掉最低位
        }
        if (ans == 1) ans += 9;     // 数字和为 1 说明 N 是 10 的幂,必须进位一次
        cout << ans;
        return 0;
    }
    
    • 1

    信息

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