मान लीजिए कि हमारे पास एक पूर्णांक n है, हमें n से कम या उसके बराबर धनात्मक पूर्णांकों की संख्या ज्ञात करनी है, जहाँ पूर्णांक संख्याओं में कम से कम एक अंक एक से अधिक बार आता है।
इसलिए, यदि इनपुट n =200 जैसा है, तो आउटपुट 38 होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक सरणी परिभाषित करें a
-
x :=n को इनिशियलाइज़ करने के लिए, जब x गैर-शून्य हो, x :=x / 10 को अपडेट करें, −
करें-
a के अंत में x mod 10 डालें
-
-
सरणी को उल्टा करें a
-
रिट :=n
-
प्रारंभ करने के लिए w :=1, d :=1, जब w
-
डी:=डी * मिनट(9, 10 - डब्ल्यू + 1)
-
रिट:=रिट - डी
-
-
फ़ंक्शन गो () को परिभाषित करें। इसमें कोई तर्क नहीं है।
-
b :=(1 बिटवाइज़ लेफ्ट शिफ्ट 10) - 1
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
प्रारंभ करने के लिए d :=i <1, जब d
-
रिट :=रिट - एक्स
-
-
अगर ((1 बिटवाइज़ लेफ्ट शिफ्ट a[i]) बिटवाइज़ और b) नॉन-ज़ीरो है, तो
-
b :=b XOR (1 बिटवाइज़ लेफ्ट शिफ्ट a[i])
-
-
अन्यथा
-
वापसी
-
-
-
(रिटर्न 1 से घटाएं)
-
-
फ़ंक्शन को कॉल करें गो ()
-
वापसी रिट
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; int solve(int n) { vector<int> a; for (int x = n; x; x /= 10) a.push_back(x % 10); reverse(a.begin(), a.end()); int ret = n; for (int w = 1, d = 1; w < a.size(); ++w) { d *= min(9, 10 − w + 1); ret −= d; } auto go = [&]() { int b = (1 << 10) − 1; for (int i = 0; i < a.size(); ++i) { for (int d = (i < 1); d < a[i]; ++d) { int x = 0; if ((1 << d) & b) ++x; for (int j = i + 1; j < a.size(); ++j) x *= 10 − j; ret −= x; } if ((1 << a[i]) & b) b ^= (1 << a[i]); else return; } −−ret; }; go(); return ret; } int main(){ cout << solve(200) << endl; return 0; }
इनपुट
200
आउटपुट
38