[R34A]FizzBuzz 游戏

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

数据规模:1n1051 \le n \le 10^51X,Y1091 \le X, Y \le 10^91ai1091 \le a_i \le 10^9

思路

不需要真正构造字符串,只关心字符 z 的总数。对每个 aia_i 用两次取模判断它是不是 XXYY 的倍数:

  • 同时是 XXYY 的倍数,对应 FizzBuzz,贡献 44z
  • 仅是其中之一的倍数,对应 FizzBuzz,贡献 22z
  • 两者都不是,保持数字不变,贡献 00

逐项累加即可。(题面样例解释里把 Buzz 误写成 Bizz,但 Buzz 同样有 22z,不影响计数。)

复杂度

时间 O(n)O(n),空间 O(n)O(n) 存数组(也可边读边算做到 O(1)O(1))。

仓颉实现

import std.console.*
import std.convert.*

main(): Int64 {
    let reader = Console.stdIn
    let header = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
    let n = header[0]
    let x = header[1]
    let y = header[2]
    let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
    var ans: Int64 = 0
    var i = 0
    while (i < n) {
        let v = a[i]
        let mx = v % x == 0
        let my = v % y == 0
        if (mx && my) {
            ans += 4
        } else if (mx || my) {
            ans += 2
        }
        i++
    }
    println(ans)
    return 0
}