竞赛编程模数数学题:求解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
相关产品推荐
相关产品推荐

