专栏文章

题解:P14495 [NCPC 2025] Arithmetic Adaptation

P14495题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min8qpk4
此快照首次捕获于
2025/12/01 22:24
3 个月前
此快照最后确认于
2025/12/01 22:24
3 个月前
查看原文

题目分析

本题核心是构造两个非零三位数(范围 999x999-999 \le x \le 999aabb,使得 a+b=sa + b = s。题目不要求唯一解,只需输出任意一组合法答案,因此无需枚举所有可能,直接构造即可。

解题思路

构造思路的核心是“固定一个数,计算另一个数”,优先选择简单的固定值减少判断逻辑:
  1. 优先固定 a=1a = 1,计算 b=s1b = s - 1
  2. 检查 bb 是否合法:非零且在 [999,999][-999, 999] 范围内。
  3. bb 合法,直接输出 aabb;若不合法(仅两种情况:b=0b=0b<999b<-999),则固定 a=1a = -1,计算 b=s(1)=s+1b = s - (-1) = s + 1,此时 bb 必合法。

合法性证明

  • a=1a=1 时,b=s1b=s-1 不合法的情况:
    • b=0b=0s=1s=1,此时 a=1a=-1b=2b=2(非零且在范围)。
    • b<999b<-999s<998s<-998,此时 a=1a=-1b=s+1999b=s+1 \ge -999(非零且在范围)。
  • 其他所有情况,a=1a=1 对应的 b=s1b=s-1 均合法(ss 最大为 999,bb 最大为 998,不超范围)。

代码实现

CPP
#include <iostream>
using namespace std;

int main() {
    // 读取题目给定的和 s
    int s;
    cin >> s;

    // 构造思路:优先选择简单的 a=1(非零、三位数范围内),计算对应的 b
    int a = 1;
    int b = s - a;  // 根据 a + b = s 推导,b = s - a

    // 检查 b 是否满足所有条件:
    // 1. b != 0:题目要求 b 非零
    // 2. b >= -999 且 b <= 999:题目要求 b 是三位数(含负三位数)
    if (b != 0 && b >= -999 && b <= 999) {
        // 若 b 合法,直接输出 a 和 b
        cout << a << " " << b << endl;
    } else {
        // 当 a=1 时 b 不合法(仅两种情况:b=0 或 b<-999)
        // 更换构造的 a 为 -1(同样满足非零、三位数范围)
        a = -1;
        // 重新计算合法的 b:b = s - a = s - (-1) = s + 1
        b = s - a;

        // 此时 b 必合法:
        // - 若之前 b=0(即 s=1),则当前 b=1+1=2(非零、在范围内)
        // - 若之前 b<-999(即 s<-998),则当前 b=s+1 >= -999(非零、在范围内)
        cout << a << " " << b << endl;
    }

    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...