2652. 倍数求和
题目描述
给你一个正整数 n ,请你计算在 [1,n] 范围内能被 3、5、7 整除的所有整数之和。
返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。
示例 1:
输入:n = 7 输出:21 解释:在 [1, 7] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7 。数字之和为 21。
示例 2:
输入:n = 10 输出:40 解释:在 [1, 10] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9、10 。数字之和为 40。
示例 3:
输入:n = 9 输出:30 解释:在 [1, 9] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9 。数字之和为 30。
提示:
- 1 <= n <= 103
解法
方法一:枚举
思考
求和 \([1,n]\) 中能被 \(3\)、\(5\) 或 \(7\) 整除的数。\(n \le 1000\),枚举每个 \(x\) 判断整除即可,实现最直接。
我们直接枚举 \([1,..n]\) 中的每一个数 \(x\),如果 \(x\) 能被 \(3\), \(5\), \(7\) 整除,那么就将 \(x\) 累加到答案中。
枚举结束后,返回答案即可。
时间复杂度 \(O(n)\),其中 \(n\) 为题目给定的整数。空间复杂度 \(O(1)\)。
1 2 3 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
方法二:数学(容斥原理)
思考
方法一线性扫过 \(n\)。能被 \(x\) 整除的数构成等差数列,其和有闭式;容斥去掉重复倍数后可 \(O(1)\) 求值。
即 \(f(3)+f(5)+f(7)-f(15)-f(21)-f(35)+f(105)\)。
我们定义函数 \(f(x)\) 表示 \([1,..n]\) 中能被 \(x\) 整除的数之和,那么一共有 \(m = \left\lfloor \frac{n}{x} \right\rfloor\) 个数能被 \(x\) 整除,这些数字分别为 \(x\), \(2x\), \(3x\), \(\cdots\), \(mx\),构成一个等差数列,首项为 \(x\),末项为 \(mx\),项数为 \(m\),因此 \(f(x) = \frac{(x + mx) \times m}{2}\)。
根据容斥原理,我们可以得到答案为:
时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
方法三
思考
与方法二同一容斥公式,仅用 Rust 重写闭式,算法与常数均不再变化。
1 2 3 4 5 6 7 8 9 10 | |