D - Only one of two
キーワード
解説
と の最小公倍数を とする。
ある数 が与えられた時、 以下の数のうち、 で割り切れる数の個数は 個、 で割り切れる数の個数は 個、 と の両方で割り切れる数の個数は 個である。
よって、 以下の数のうち、 または のどちらか一方で割り切れる数の個数は 個である。
つまり、 が 条件をみたす数の時、 は 小さい順に 番目の数であることを意味する。
となる を求めればよく、これは二分探索で求めることができる。
提出コード
func main() {
var n, m, k int
scanIntVariables(&n, &m, &k)
l := lcm(n, m)
check := func(x int) bool {
return x/m+x/n-x/l*2 < k
}
left := 0
right := math.MaxInt64
for right-left > 1 {
mid := (left + right) / 2
if check(mid) {
left = mid
} else {
right = mid
}
}
writeLine(left + 1)
}