[R16B] 两个按钮

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 数学

数据规模:1≤T≤10001 \le T \le 1000,1≤a,b≤10001 \le a, b \le 1000,1≤n≤10001 \le n \le 1000,1≤k≤1061 \le k \le 10^6。

思路

设按了 ii 次 AA 按钮(0≤i≤n0 \le i \le n),则 BB 按钮按了 n−in-i 次,总分 =i×a+(n−i)×b= i \times a + (n-i) \times b。要求它等于 kk,即

i(a−b)=k−nb.i(a-b) = k - nb.

当 a≠ba \ne b 时,解出 i=k−nba−bi = \dfrac{k-nb}{a-b},只需检查它是否为 [0,n][0, n] 内的整数;当 a=ba = b 时,总分恒为 nana,直接比较 kk 与 nana。

复杂度:每组时间 O(1)O(1),空间 O(1)O(1)。

仓颉实现

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

let reader = getStdIn()

func solve(): Unit {
    let abnk = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
    let a = abnk[0]
    let b = abnk[1]
    let n = abnk[2]
    let k = abnk[3]
    var ok = false
    if (a == b) {
        ok = (k == n * a)
    } else {
        let num = k - n * b
        let den = a - b
        if (num % den == 0) {
            let i = num / den
            ok = (0 <= i && i <= n)
        }
    }
    println(if (ok) { "YES" } else { "NO" })
}

main() {
    let t = Int64.parse(reader.readln().getOrThrow())
    for (i in 0..t) {
        solve()
    }
}

要点:

  • 除法的整除性用 num % den == 0 判断;仓颉中负数取模的符号跟随被除数,这里只需要判断是否为 0,不受影响。
  • a == b 时公式退化,单独处理。