LeetCode 2894.分类求和并作差:数学O(1)一行解决

【LetMeFly】2894.分类求和并作差:数学O(1)一行解决

力扣题目链接:https://leetcode.cn/problems/divisible-and-non-divisible-sums-difference/

给你两个正整数 nm

现定义两个整数 num1num2 ,如下所示:

  • 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

解题方法:数学

这就需要拿出我们小学二年级就学过的等差数列求和公式 ⌊ ( 首项 + 尾项 ) × 项数 2 ⌋ \lfloor\frac{(首项+尾项)\times 项数}{2}\rfloor ⌊2(首项+尾项)×项数⌋

另外有 n u m 1 − n u m 2 = ( n u m 1 + n u m 2 ) − n u m 2 num1-num2=(num1+num2)-num2 num1−num2=(num1+num2)−num2,而 n u m 1 + n u m 2 num1+num2 num1+num2就是整个数列 1 1 1到 n n n的和, n u m s 2 nums2 nums2就是首项为 m m m尾项为 ⌊ n m ⌋ × m \lfloor\frac{n}m\rfloor\times m ⌊mn⌋×m项数为 ⌊ n m ⌋ \lfloor\frac{n}m\rfloor ⌊mn⌋的等差数列。

  • 时间复杂度 O ( 1 ) O(1) O(1)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-27 21:42:21
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-27 21:53:29
 */
class Solution {
public:
    int differenceOfSums(int n, int m) {
        return (1 + n) * n / 2 - (m + n / m * m) * (n / m);
    }
};
Python
python 复制代码
'''
Author: LetMeFly
Date: 2025-05-27 21:42:21
LastEditors: LetMeFly.xyz
LastEditTime: 2025-05-27 21:54:46
'''
class Solution:
    def differenceOfSums(self, n: int, m: int) -> int:
        return (1 + n) * n // 2 - (m + n // m * m) * (n // m)
Java
java 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-27 21:42:21
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-27 21:57:48
 */
class Solution {
    public int differenceOfSums(int n, int m) {
        return (1 + n) * n / 2 - (m + n / m * m) * (n / m);
    }
}
Go
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-27 21:42:21
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-27 21:58:33
 */
package main

func differenceOfSums(n int, m int) int {
    return (1 + n) * n / 2 - (m + n / m * m) * (n / m)
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
米粒12 小时前
力扣算法刷题 Day 27
算法·leetcode·职场和发展
Fuxiao___3 小时前
C 语言核心知识点讲义(循环 + 函数篇)
算法·c#
Mr_Xuhhh4 小时前
LeetCode hot 100(C++版本)(上)
c++·leetcode·哈希算法
漫随流水4 小时前
c++编程:反转字符串(leetcode344)
数据结构·c++·算法
穿条秋裤到处跑5 小时前
每日一道leetcode(2026.03.31):字典序最小的生成字符串
算法·leetcode
CoovallyAIHub7 小时前
VisionClaw:智能眼镜 + Gemini + Agent,看一眼就能帮你搜、帮你发、帮你做
算法·架构·github
CoovallyAIHub8 小时前
低空安全刚需!西工大UAV-DETR反无人机小目标检测,参数减少40%,mAP50:95提升6.6个百分点
算法·架构·github
CoovallyAIHub8 小时前
IEEE Sensors | 湖南大学提出KGP-YOLO:先定位风电叶片再检测缺陷,三数据集mAP均超87%
算法
Yupureki8 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-路径dp
数据结构·c++·算法·动态规划
副露のmagic8 小时前
数组章节 leetcode 思路&实现
算法·leetcode·职场和发展