[R78B] 国王收金币啦

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1≤k≤50001 \le k \le 5000。

思路

第 dd 天收取的金币数等于 11 加上「不超过 dd 的完全平方数个数」(第 11 天本身是完全平方数,它结束后每天多收 11 枚,所以第 22 天起每天收 22 枚,依此类推)。

直接按题意模拟:维护当前每天收取的数量 curcur 和下一个完全平方数的平方根 sqsq,从第 11 天遍历到第 kk 天,每天累加 curcur;若当天 d=sq2d=sq^2,说明这一天结束后要涨价,把 curcur 加 11、sqsq 加 11。

复杂度

时间复杂度 O(k)O(k),空间复杂度 O(1)O(1)。

仓颉实现

查看仓颉实现
import std.env.*
import std.convert.*

main() {
    let reader = getStdIn()
    let k = Int64.parse(reader.readln().getOrThrow())
    var ans: Int64 = 0
    var cur: Int64 = 1
    var d: Int64 = 1
    var sq: Int64 = 1
    while (d <= k) {
        ans += cur
        if (d == sq * sq) {
            cur += 1
            sq += 1
        }
        d += 1
    }
    println(ans)
}