Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में n से कम उन पूर्णांकों की संख्या ढूंढना जिनमें एक ही अंक एक से अधिक बार आता है


परिचय

मान लीजिए हमारे पास एक पूर्णांक n है, हमें उन धनात्मक पूर्णांकों की संख्या ढूंढनी है जो n से कम या बराबर हैं, जहां पूर्णांक में कम से कम एक अंक एक से अधिक बार आता है।

तो, यदि इनपुट n = 200 है, तो आउटपुट 38 होगा।

समाधान दृष्टिकोण

यह समस्या "कम से कम एक डुप्लिकेट अंक वाली संख्याएं" गिनने के बराबर है। हम पूरक (complement) गिनते हैं: सभी अंक अलग-अलग वाली संख्याएं, फिर कुल से घटाते हैं।

उदाहरण कोड

#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

व्याख्या

1 से 200 तक 38 संख्याएं ऐसी हैं जिनमें कम से कम एक अंक दोहराता है। यह कॉम्बिनेटोरिक्स और बिटमास्किंग का उपयोग करके कुशलता से गणना करता है।

निष्कर्ष

यह अंक DP (Digit DP) समस्या का एक अनुकूलित समाधान है। बिटमास्क प्रयुक्त अंकों को ट्रैक करता है। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स वाला एक ग्राफ दिया गया है। वर्टेक्स 1 से n तक संख्याबद्ध हैं और edges सरणी में दी गई एज्स से जुड़े हैं। प्रत्येक वर्टेक्स का एक x मान है जो 1 से n के बीच होता है, यह values सरणी में दिया गया है। हमें ग्राफ में सुपर वर्टेक्स खोजने हैं। एक वर्टेक्स i को सुपर वर्टेक्स कहा जाता है

  1. - दिए गए पूर्णांकों से अधिकतम संभावित टैली ज्ञात करने का C++ प्रोग्राम

    मान लीजिए हमें दो पूर्णांक n और m दिए गए हैं और k टपल्स हैं जिनमें चार पूर्णांक {ai, bi, ci, di} हैं। चार सरणियाँ a, b, c, d दी गई हैं जहाँ a[i] i-वें टपल का a मान दर्शाता है। अब एक अनुक्रम dp पर विचार करें जिसमें n धनात्मक पूर्णांक हों और 1 ≤ dp[1] < dp[2] < ... < dp[n] ≤ m। हम एक मेट्रिक टैली परि

  1. ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम

    मान लीजिए h × w आयाम का एक ग्रिड दिया गया है। ग्रिड की सेल्स में बल्ब या बाधाएँ हो सकती हैं। एक बल्ब सेल स्वयं और अपने दाएँ, बाएँ, ऊपर, नीचे की सेल्स को रोशन करता है। प्रकाश सेल्स के माध्यम से चमकता है जब तक कि कोई बाधा सेल इसे न रोक दे। बाधा सेल न तो रोशन हो सकती है और न ही प्रकाश को गुजरने देती ह