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

求满足(a+b)可被K整除且a+b≤N的所有b值(暴力法超时求优化)

优化求解满足条件的b值方案

问题描述

给定三个正整数 (a, K, N)(满足 (0 < a, K, N < 10^9)),找出所有满足以下条件的正整数 (b):

  • (a + b \leq N)
  • ((a + b) % K = 0)

示例:输入 10 6 40,输出结果为 2 8 14 20 26

暴力解法的问题

你提供的暴力解法通过遍历所有可能的 (b) 来判断是否符合条件,时间复杂度为 (O(N))。当 (N) 接近 (10^9) 时,遍历次数会达到上亿次,必然触发超时。

优化思路(数学推导)

设 (s = a + b),则问题可转化为寻找满足以下条件的 (s):

  1. (s) 是 (K) 的倍数(即 (s = m \times K),(m) 为正整数)
  2. (a < s \leq N)(因为 (b \geq 1),所以 (s = a + b \geq a + 1))

通过计算 (m) 的取值范围,直接推导所有符合条件的 (b):

  • 最小的 (m)(记为 (m_{\text{min}})):取大于 (a/K) 的最小整数,即 (m_{\text{min}} = \lfloor a / K \rfloor + 1)
  • 最大的 (m)(记为 (m_{\text{max}})):取不超过 (N/K) 的最大整数,即 (m_{\text{max}} = \lfloor N / K \rfloor)

若 (m_{\text{min}} > m_{\text{max}}),说明没有符合条件的 (b),输出 -1;否则,每个 (m) 对应的 (b = m \times K - a),收集这些值即可。

优化后代码

a, K, N = map(int, input().split())
m_min = (a // K) + 1
m_max = N // K

if m_min > m_max:
    print(-1)
else:
    result = [str(m * K - a) for m in range(m_min, m_max + 1)]
    print(' '.join(result))

代码验证

以示例输入 10 6 40 为例:

  • (a//K = 1),故 (m_{\text{min}} = 2)
  • (N//K = 6),故 (m_{\text{max}} = 6)
  • 遍历 (m=2) 到 (6),计算得 (b) 分别为 (2, 8, 14, 20, 26),与示例输出一致。

该方案的时间复杂度为 (O(M))((M) 为符合条件的 (b) 的数量),远低于暴力解法的 (O(N)),即使 (N) 接近 (10^9) 也能高效运行。

内容的提问来源于stack exchange,提问作者Pson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:06:30