ABC
D - Only one of two

D - Only one of two

キーワード

解説

問題 (opens in a new tab)

NNMM の最小公倍数を LL とする。

ある数 XX が与えられた時、XX 以下の数のうち、NN で割り切れる数の個数は X/N\lfloor X/N \rfloor 個、MM で割り切れる数の個数は X/M\lfloor X/M \rfloor 個、NNMM の両方で割り切れる数の個数は X/L\lfloor X/L \rfloor 個である。

よって、XX 以下の数のうち、NN または MM のどちらか一方で割り切れる数の個数は k=X/N+X/MX/L×2k = \lfloor X/N \rfloor + \lfloor X/M \rfloor - \lfloor X/L \rfloor \times 2 個である。

つまり、XX が 条件をみたす数の時、XX は 小さい順に kk 番目の数であることを意味する。

k=Kk = K となる XX を求めればよく、これは二分探索で求めることができる。

提出コード

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)
}