2894.分类求和并作差

目标

给你两个正整数 n 和 m 。

现定义两个整数 num1 和 num2 ,如下所示:

  • num1:范围 [1, n] 内所有 无法被 m 整除 的整数之和。
  • num2:范围 [1, n] 内所有 能够被 m 整除 的整数之和。

返回整数 num1 - num2 。

示例 1:

输入:n = 10, m = 3
输出:19
解释:在这个示例中:
- 范围 [1, 10] 内无法被 3 整除的整数为 [1,2,4,5,7,8,10] ,num1 = 这些整数之和 = 37 。
- 范围 [1, 10] 内能够被 3 整除的整数为 [3,6,9] ,num2 = 这些整数之和 = 18 。
返回 37 - 18 = 19 作为答案。

示例 2:

输入:n = 5, m = 6
输出:15
解释:在这个示例中:
- 范围 [1, 5] 内无法被 6 整除的整数为 [1,2,3,4,5] ,num1 = 这些整数之和 =  15 。
- 范围 [1, 5] 内能够被 6 整除的整数为 [] ,num2 = 这些整数之和 = 0 。
返回 15 - 0 = 15 作为答案。

示例 3:

输入:n = 5, m = 1
输出:-15
解释:在这个示例中:
- 范围 [1, 5] 内无法被 1 整除的整数为 [] ,num1 = 这些整数之和 = 0 。 
- 范围 [1, 5] 内能够被 1 整除的整数为 [1,2,3,4,5] ,num2 = 这些整数之和 = 15 。
返回 0 - 15 = -15 作为答案。

说明:

  • 1 <= n, m <= 1000

思路

1 ~ n 中无法整除 m 的所有整数和 num1 与 能够整除 m 的所有整数和 num2 之差。

依题意模拟即可。

或者使用等差数列求和公式计算。

根据等差数列求和公式得到所有元素和为 total = (n + 1) * n / 2,能够被 m 整除的所有整数和为 首项为 m,公差为 m,个数为 cnt = n / m 的等差数列和,num2 = m * (cnt + 1) * cnt / 2。结果为 total - 2 * num2

代码


/**
 * @date 2025-05-27 1:00
 */
public class DifferenceOfSums2894 {

    public int differenceOfSums(int n, int m) {
        int total = (n + 1) * n / 2;
        int cnt = n / m;
        return total - m * (1 + cnt) * cnt;
    }

}

性能

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注