2652. 倍数求和

254 阅读1分钟

2652. 倍数求和

方法一(枚举): 模拟[1,n]中,能被3、5、7整除的数,对其求和

class Solution:
    def sumOfMultiples(self, n: int) -> int:
        return sum(i for i in range(1,n+1) if i % 3 == 0 or i % 5 == 0 or i % 7 == 0)

方法二(等差数列-容斥原理):

[1,n]中 能被3 整除的个数有m=n/3个分别为(1 * 3,2 * 3,3 * 3...,m * 3) 同理,则[1,n]中能被x整除的数有m = n/m 个分别为(1 * x,2 * x,3 * x,...,m * x)则构成等差数列首项为x,尾项为mx,项数为m,等差数列求和公式

f(x) = ( x + m * x) * m / 2

又因三个集合的容斥原理,得答案为: f(3) + f(5) + f(7) - f(3 * 5) - f(3 * 7) - f(5 * 7) + f(3 * 5 * 7)

class Solution:
    def sumOfMultiples(self, n: int) -> int:
        def f(x):
            m = n // x
            return (x + m*x) * m // 2
        return f(3) + f(5) + f(7) - f(3*5) - f(3*7) - f(5*7) + f(3*5*7)