[R39B]倍数
- 难度 普及
- 时限 1s
- 空限 512m
- 枚举
对于 的数据,满足 ,。
思路
,子数组总数约为 ,可以直接 枚举所有子数组。
固定左端点 ,向右枚举右端点 ,维护当前段 的最大值 与最小值 。每加入一个 ,用 时间更新:
若 ,则该子数组满足条件,答案加一。由于 ,,取模不会除零。
复杂度
- 时间:,约 次基本运算,在 1s 时限内绰绰有余。
- 空间:,仅存储输入数组与少量变量。
仓颉实现
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 ans: Int64 = 0
var l = 0
while (l < n) {
var mx = a[l]
var mn = a[l]
var r = l
while (r < n) {
if (a[r] > mx) {
mx = a[r]
}
if (a[r] < mn) {
mn = a[r]
}
if (mx % mn == 0) {
ans = ans + 1
}
r = r + 1
}
l = l + 1
}
println(ans)
return 0
}