You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

竞赛编程模数数学题:求解N的解法推导逻辑疑问

从S反推N:竞赛模数题的推导解析

题目回顾

Meow写下一个3位及以上的数字N,去掉最后一位得到M,计算S = N - M并告知你S,要求找出所有可能的N。

  • 输入:第一行是测试用例数t(1≤t≤1000),每个用例输入正整数S(100≤S≤10^17)
  • 输出:每个用例输出所有可能的N,升序排列

示例输入:

3
100
500
1800

示例输出:

111
555
1999 2000

核心疑问

公开解法中反复用到数字9,这个数字的作用是什么?整个解法的推导逻辑是怎样的?

完整推导过程

1. 建立N和M的数学关系

设N是一个k位数(k≥3),把N拆成两部分:

  • M:去掉N最后一位得到的数(至少是2位数)
  • d:N的最后一位数字(0≤d≤9)

根据10进制数的结构,N可以表示为:
N = M × 10 + d

题目给出S = N - M,将N的表达式代入后:
S = (M×10 + d) - M = 9×M + d

到这里就能看到数字9的来源:它是10进制基数(10)减1的结果,是拆分N后与M做差时自然产生的系数,本质是10进制数的结构属性。

2. 求解M和d

我们需要从S = 9×M + d中反推合法的M和d,其中M≥10(因为N是3位及以上,M至少是2位数),0≤d≤9。

分两种情况讨论:

情况1:d≠0

此时d = S % 9(S除以9的余数就是d,d在1-9之间),对应的M为:
M = (S - d) ÷ 9

代入N的表达式,得到唯一解:
N = M×10 + d

情况2:d=0

当S是9的倍数时,S % 9 = 0,此时d可以取0,同时还有另一种合法的d值:d=9(因为9≤9,满足最后一位数字的要求)。

  • 当d=0时:S = 9×M → M = S÷9,对应N为M×10 + 0
  • 当d=9时:S = 9×M + 9 = 9×(M+1) → M = (S - 9)÷9 = S÷9 -1,对应N为M×10 +9

验证可知:因为S≥100,所以S÷9≥11.11,S÷9 -1≥10.11,即M至少是10,对应的N是3位及以上,完全符合题目要求。

3. 对应代码逻辑

给出的代码完全对应上述推导:

t = int(input())

for _ in range(t):
    n = int(input())  # n就是题目中的S
    
    last_digit = n % 9  # 对应推导中的d
    x = (n - last_digit) // 9  # 对应推导中的M
    
    if last_digit == 0:
        # d=0和d=9的两种情况,输出两个解
        print((x - 1) * 10 + 9, x * 10)
    else:
        # d≠0时唯一解
        print(x * 10 + last_digit)

内容的提问来源于stack exchange,提问作者Jia Yee Chong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:27