1class Solution {2public int nthUglyNumber(int n, int a, int b, int c) {3int left = 1;4int right = Integer.MAX_VALUE;5int count = 0;6while (left < right) {7int middle = left + (right - left) / 2;8if (isUgly(middle, a, b, c, n)) {9right = middle;10} else left = middle + 1;11}12return left;13}1415public boolean isUgly(long middle, long a, long b, long c, long n) {16return (int)17(middle / a18+ middle / b19+ middle / c20- middle / lcm(a, b)21- middle / lcm(b, c)22- middle / lcm(c, a)23+ middle / lcm(a, lcm(b, c)))24>= n;25}2627public long gcd(long a, long b) {28if (a == 0) return b;29else return gcd(b % a, a);30}3132public long lcm(long a, long b) {33return a * b / (gcd(a, b));34}35}