[R9C] k倍数区间
- 难度 普及-
- 时限 1s
- 空限 512m
- 前缀和
数据规模:,,。
思路
设前缀和 ,区间 的区间和为 。区间和是 的倍数等价于 。
枚举右端点 ,用 记录 中 的个数,则 的贡献为 ,统计后把 加一。初始 (空前缀)。
复杂度:时间 ,空间 。
仓颉实现
import std.convert.*
import std.env.*
main() {
let reader = getStdIn()
let line0 = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
let k = line0[1]
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
let cnt = Array<Int64>(k, { _ => 0 })
cnt[0] = 1
var s: Int64 = 0
var ans: Int64 = 0
for (v in a) {
s = (s + v) % k
ans = ans + cnt[s]
cnt[s] = cnt[s] + 1
}
println(ans)
}