package leetcode
func nthMagicalNumber(N int, A int, B int) int {
	low, high := int64(0), int64(1*1e14)
	for low < high {
		mid := low + (high-low)>>1
		if calNthMagicalCount(mid, int64(A), int64(B)) < int64(N) {
			low = mid + 1
		} else {
			high = mid
		}
	}
	return int(low) % 1000000007
}
func calNthMagicalCount(num, a, b int64) int64 {
	ab := a * b / gcd(a, b)
	return num/a + num/b - num/ab
}
func gcd(a, b int64) int64 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}