[R35C]平均数
对于 的数据,。
对于 的数据,,。
思路
设数组元素之和为 。对有序对 ()执行一次操作后,数组总和变为 。数组完美的充要条件是新总和能被 整除,即:
移项得:
即:
于是问题转化为同余计数。用 表示满足 的下标个数。对每个下标 ,令:
则所有 的 都满足条件,共有 个。注意要排除 的情况:当 时, 本身也被计入了一次,需要从答案中减去 。
对所有 累加即得答案。
复杂度
- 时间复杂度:,两次遍历加一次计数。
- 空间复杂度:,用于存放计数数组。
仓颉实现
import std.convert.*
import std.env.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
var sum: Int64 = 0
for (k in 0 .. n) {
sum += a[k]
}
// cnt[r] = number of a_k with a_k % n == r
let nn = n
var cnt = Array<Int64>(nn, { _ => 0 })
for (k in 0 .. n) {
let r = ((a[k] % n) + n) % n
cnt[r] += 1
}
var ans: Int64 = 0
for (k in 0 .. n) {
let target = (((a[k] - sum) % n) + n) % n
ans += cnt[target]
if ((((a[k] % n) + n) % n) == target) {
ans -= 1
}
}
println(ans)
return 0
}