878. Nth Magical Number
Solution
關鍵在於如何找出num以下有多少Magical Number
f(num) = num/A + num/B - num/lcm(A,B)
知道這點之後就是一般的binary search問題,找出滿足條件的最小num
long lcm;
public int nthMagicalNumber(int N, int A, int B) {
if(B > A){
int temp = A;
A = B;
B = temp;
}
long min = B;
long max = (long)A*N;
lcm = A*B/gcd(A,B);
while(min < max){
long mid = min + (max-min)/2;
if(isEnough(mid, N, A, B)){
max = mid;
}
else{
min = mid+1;
}
}
return (int)(min%(1e9 + 7));
}
public long gcd(int A, int B){
if(B == 0) return (long)A;
return gcd(B, A%B);
}
public boolean isEnough(long num, int N, int A, int B){
long total = num/A + num/B - num/lcm;
if(total >= (long)N) return true;
return false;
}
Last updated
Was this helpful?