[R66B] 游戏装备

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

数据规模:1n1051 \le n \le 10^50x<9982443530 \le x < 998244353

思路

用变量维护当前战斗力(始终保持在模 998244353998244353 意义下):A 类型装备做加法后取模,B 类型装备做乘法后取模。每件装备处理完输出一次。

复杂度:时间 O(n)O(n),空间 O(1)O(1)

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    var cur: Int64 = 0
    for (i in 0..n) {
        let line = reader.readln().getOrThrow().split(" ", removeEmpty: true)
        let x = Int64.parse(line[1])
        if (line[0] == "A") {
            cur = (cur + x) % 998244353
        } else {
            cur = (cur * x) % 998244353
        }
        println(cur)
    }
    return 0
}

要点:

  • 每步都取模,中间值始终小于模数,Int64 乘法不会溢出((109)21018(10^9)^2 \approx 10^{18}Int64 范围内)。
  • 类型字符按整行 split 后取第一个元素与 "A" 比较,B 类型走 else 分支。