[R5E] 余数和

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 数学

思路

Nmodi=Ni×NiN \bmod i = N - i \times \left\lfloor \frac{N}{i} \right\rfloor

所以 i=1N(Nmodi)=N2i=1Ni×Ni\sum_{i=1}^{N}(N \bmod i) = N^2 - \sum_{i=1}^{N} i \times \left\lfloor \frac{N}{i} \right\rfloor

Ni\left\lfloor \frac{N}{i} \right\rfloor 只有 O(N)O(\sqrt N) 种取值,按相同的商分块:对块 [l,r][l, r]r=NN/lr = \left\lfloor \frac{N}{\lfloor N/l \rfloor} \right\rfloor),商为 qq,贡献为 q×(l+r)(rl+1)2q \times \frac{(l+r)(r-l+1)}{2}

复杂度:时间 O(N)O(\sqrt N),空间 O(1)O(1)

仓颉实现

import std.convert.*
import std.env.*

main() {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    var total: Int64 = 0
    var l: Int64 = 1
    while (l <= n) {
        let q = n / l
        let r = n / q
        total += q * (l + r) * (r - l + 1) / 2
        l = r + 1
    }
    println(n * n - total)
}