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

दो शर्तों के साथ ब्लॉकों को पेंट करने के तरीकों की संख्या गिनने के लिए C++ प्रोग्राम


मान लीजिए हमारे पास तीन संख्याएं N, M और K हैं। मान लें N ब्लॉक हैं जो एक पंक्ति में व्यवस्थित हैं। हम उन्हें पेंट करने के निम्नलिखित दो तरीकों पर विचार करते हैं। दो ब्लॉकों के पेंट तभी अलग माने जाते हैं जब ब्लॉकों को निम्नलिखित दो तरीकों से अलग-अलग रंगों से रंगा जाता है:

  • प्रत्येक ब्लॉक के लिए, इसे पेंट करने के लिए M रंगों में से एक का उपयोग करें। (सभी रंगों का उपयोग करना अनिवार्य नहीं है)
  • आसन्न ब्लॉकों के अधिकतम K युग्म हो सकते हैं जिन्हें समान रंग से रंगा गया है।

यदि उत्तर बहुत बड़ा है, तो परिणाम को 998244353 मॉड्यूलो वापस करें।

उदाहरण के लिए, यदि इनपुट N = 3; M = 2; K = 1 है, तो आउटपुट 6 होगा, क्योंकि हम उन्हें इन विभिन्न प्रारूपों में पेंट कर सकते हैं: 112, 121, 122, 211, 212, और 221।

चरण

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:

maxm := 2^6 + 5 p := 998244353 आकार maxm के दो बड़े ऐरे fac और inv परिभाषित करें एक फ़ंक्शन ppow() परिभाषित करें, जो a, b, p लेता है, ans := 1 mod p a := a mod p जब तक b शून्येतर है, करें: यदि b विषम है, तो: ans := ans * a mod p a := a * a mod p b := b/2 ans वापस करें एक फ़ंक्शन C() परिभाषित करें, जो n, m लेता है, यदि m < 0 या m > n, तो: 0 वापस करें fac[n] * inv[m] mod p * inv[n - m] mod p वापस करें मुख्य विधि से, निम्नलिखित करें fac[0] := 1 i := 1 से maxm-1 तक, करें: fac[i] := fac[i - 1] * i mod p inv[maxm - 1] := ppow(fac[maxm - 1], p - 2, p) i := maxm - 2 से 0 तक, करें: inv[i] := (i + 1) * inv[i + 1] mod p ans := 0 i := 0 से k तक, करें: t := C(n - 1, i) tt := m * ppow(m - 1, n - i - 1, p) ans := (ans + t * tt mod p) mod p ans वापस करें

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; const long maxm = 2e6 + 5; const long p = 998244353; long fac[maxm], inv[maxm]; long ppow(long a, long b, long p){    long ans = 1 % p;    a %= p;    while (b){       if (b & 1)          ans = ans * a % p;       a = a * a % p;       b >>= 1;    }    return ans; } long C(long n, long m){    if (m < 0 || m > n)       return 0;    return fac[n] * inv[m] % p * inv[n - m] % p; } long solve(long n, long m, long k){    fac[0] = 1;    for (long i = 1; i < maxm; i++)       fac[i] = fac[i - 1] * i % p;    inv[maxm - 1] = ppow(fac[maxm - 1], p - 2, p);    for (long i = maxm - 2; i >= 0; i--)       inv[i] = (i + 1) * inv[i + 1] % p;    long ans = 0;    for (long i = 0; i <= k; i++){       long t = C(n - 1, i);       long tt = m * ppow(m - 1, n - i - 1, p) % p;       ans = (ans + t * tt % p) % p;    }    return ans; } int main(){    int N = 3;    int M = 2;    int K = 1;    cout << solve(N, M, K) << endl; }

इनपुट

3, 2, 1

आउटपुट

6

  1. कुछ शर्तों के साथ ग्राफ बनाने के लिए C++ प्रोग्राम कुछ शर्तों के साथ ग्राफ बनाने के लिए C++ प्रोग्राम

    मान लीजिए हमारे पास दो संख्याएं N और K हैं। N तत्वों वाला एक निदेशित ग्राफ पर विचार करें। N शीर्ष निम्नलिखित शर्तों को पूरा करते हैं: ग्राफ सरल और जुड़ा हुआ है शीर्ष 1 से N तक गिने जाते हैं मान लें M ग्राफ में किनारों की संख्या है। किनारों को 1 से M तक गिना जाता है। किनारे की लंबाई 1 है। और किनारा

  1. N × 3 ग्रिड को रंगने के तरीकों की संख्या - C++ प्रोग्राम N × 3 ग्रिड को रंगने के तरीकों की संख्या - C++ प्रोग्राम

    मान लीजिए हमारे पास एक ग्रिड है जिसका आकार n x 3 है और हम ग्रिड के प्रत्येक सेल को तीन रंगों में से ठीक एक से रंगना चाहते हैं। यहां उपयोग किए जाने वाले रंग लाल, पीला और हरा हैं।अब एक प्रतिबंध है, कि कोई दो आसन्न सेल एक ही रंग के नहीं हो सकते। हमारे पास ग्रिड की n संख्या में पंक्तियाँ हैं। अंत में, ह

  1. पायथन में ट्री को दो ट्री में विभाजित करने के तरीकों की गिनती का प्रोग्राम पायथन में ट्री को दो ट्री में विभाजित करने के तरीकों की गिनती का प्रोग्राम

    मान लीजिए हमारे पास एक बाइनरी ट्री है जिसमें 0, 1 और 2 मान हैं। रूट में कम से कम एक 0 नोड और एक 1 नोड है। अब मान लीजिए एक ऑपरेशन है जहां हम ट्री में एक किनारा हटाते हैं और ट्री दो अलग-अलग ट्री बन जाता है। हमें उन तरीकों की संख्या ढूंढनी है जिनसे हम एक किनारा हटा सकते हैं जैसे कि दोनों ट्री में से को