मान लीजिए हमें n-th बदसूरत संख्या खोजने के लिए एक प्रोग्राम लिखना है। बदसूरत संख्याएँ धनात्मक पूर्णांक होती हैं जो a या b या c से विभाज्य होती हैं। उदाहरण के लिए, यदि n =3 और a =2, b =3 और c =5, तो आउटपुट 4 होगा, क्योंकि बदसूरत संख्याएँ हैं [2,3,4,5,6,8,9,10] , तीसरा वाला 4 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
ओके () नामक एक विधि बनाएं, इसमें एक्स, ए, बी, सी लगेगा, यह नीचे की तरह कार्य करेगा -
-
वापसी (x/a) + (x/b) + (x/c) – (x/lcm(a,b)) – (x/lcm(b, c)) – (x/lcm(b,c) ) - (x/lcm(a,c)) + (x/lcm(a, lcm(b,c)))
-
मुख्य विधि से, निम्नलिखित करें -
-
निम्न :=1, उच्च :=2 * (10^9)
-
जबकि कम <उच्च -
-
मध्य:=निम्न + (उच्च-निम्न)/2
-
एक्स:=ठीक है (मध्य, ए, बी, सी)
-
यदि x>=n, तो उच्च :=मध्य, अन्यथा निम्न :=मध्य + 1
-
-
उच्च वापसी
उदाहरण (C++)
एक बेहतर समझ प्राप्त करने के लिए आइए निम्नलिखित कार्यान्वयन को देखें -
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
lli gcd(lli a, lli b){
return b == 0? a: gcd(b, a % b);
}
lli lcm(lli a, lli b){
return a * b / gcd(a, b);
}
lli ok(lli x, lli a, lli b, lli c){
return (x / a) + (x / b) + (x / c) - (x / lcm(a, b)) - (x / lcm(b, c)) - (x / lcm(a, c)) + (x / lcm(a, lcm(b, c)));
}
int nthUglyNumber(int n, int a, int b, int c) {
int low = 1;
int high = 2 * (int) 1e9;
while(low < high){
int mid = low + (high - low) / 2;
int x = ok(mid, a, b, c);
if(x>= n){
high = mid;
}
else low = mid + 1;
}
return high;
}
};
main(){
Solution ob;
cout << (ob.nthUglyNumber(3,2,3,5));
} इनपुट
3 2 3 5
आउटपुट
4