[R24B]买糖果
数据规模:,,。
思路
三种钱币的面额为 、、。设使用 枚 元、 枚 元、 枚 元,则凑钱条件为 。一旦 确定, 就被唯一确定(且 等价于 )。所以方案数等于满足 的非负整数对 的个数。
直接枚举 或 都可以,但复杂度取决于谁更小。注意到 而 ,于是:
的取值很少,因此枚举 。对每个固定的 ,剩余金额 ,能用的 元张数 的范围是 ,共 种。累加即可。
注意 可达 、 可达 数量级,累加结果用 Int64 完全够,不会溢出。
复杂度
时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let line = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let a = line[0]
let b = line[1]
let x = line[2]
// j*a + k*b <= x,枚举 k,统计满足条件的 j >= 0 的个数
var ans: Int64 = 0
var k: Int64 = 0
while (k * b <= x) {
let rem = x - k * b
ans += rem / a + 1
k += 1
}
println(ans.toString())
return 0
}