来自前 N 个自然数且余数至少为 K 的对数
给定两个正整数N和K ,任务是在[1, N]范围内找到对(a, b)的数量,使得a%b至少为 K 。
例子:
Input: N = 5, K = 2
Output: 7
Explanation:
Following are the all possible pairs satisfying the given criteria:
- (2, 3): The value of 2%3 = 2(>= K).
- (5, 3): The value of 5%3 = 2(>= K).
- (2, 4): The value of 2%4 = 2(>= K).
- (3, 4): The value of 3%4 = 3(>= K).
- (2, 5): The value of 2%5 = 2(>= K).
- (3, 5): The value of 3%5 = 3(>= K).
- (4, 5): The value of 4%5 = 4(>= K).
Therefore, the total count of pairs is 7.
Input: N = 6, K = 0
Output: 36
朴素方法:解决给定问题的最简单方法是在[1, N]范围内生成所有可能的对(a, b) ,如果a%b的值至少为 K ,则计算这对对。检查所有对后,打印获得的总对。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:上述方法也可以通过迭代范围[1, N]并固定对中的第二个数字,即b来优化。对于每个固定的b ,将有一个N/b周期,并且每个周期都可以与(b – K)个元素组合。因此,总共有(N/b)*(b – K)个元素。现在对于剩余的N%b元素,将有max(0, n%b – k + 1)对。请按照以下步骤解决问题:
- 如果K的值为0 ,则打印N 2作为有效对的结果数。
- 初始化变量,例如ans为0 ,它存储对的结果计数。
- 使用变量b遍历范围[K + 1, N]并执行以下步骤:
- 将(N/b)*(b – K)的值添加到变量ans中。
- 将(N % b – K + 1)的最大值或0添加到变量ans中。
- 执行上述步骤后,打印ans的值作为结果对数。
下面是上述方法的实现:
C++
Java
Python3
C#
Javascript
输出:
时间复杂度: O(N)
辅助空间: O(1)