[R16B] 两个按钮

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

数据规模:1T10001 \le T \le 10001a,b10001 \le a, b \le 10001n10001 \le n \le 10001k1061 \le k \le 10^6

思路

设按了 iiAA 按钮(0in0 \le i \le n),则 BB 按钮按了 nin-i 次,总分 =i×a+(ni)×b= i \times a + (n-i) \times b。要求它等于 kk,即

i(ab)=knb.i(a-b) = k - nb.

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

复杂度:每组时间 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(): Int64 {
    let t = Int64.parse(reader.readln().getOrThrow())
    for (i in 0..t) {
        solve()
    }
    return 0
}

要点:

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