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

C++ का उपयोग करके K व्युत्क्रमों के साथ क्रमपरिवर्तन की संख्या ज्ञात कीजिए

एक सरणी में, एक जोड़ी a[i], a[j] को व्युत्क्रम के रूप में जाना जाता है यदि a[i]> a[j] और i

Input: N = 4, K = 1
Output: 3
Explanation: Permutation of the first N numbers in total : 1234, 1243, 1324 and 2134. With 1 inversion we have 1243, 1324 and 2134.

Input : N = 3, K = 2
Output : 3
Explanation: Permutation of the first N numbers in total : 123, 132, 213, 231, 312, and 321 with 2 inversions we have 231, 312 and 321.

समाधान खोजने के लिए दृष्टिकोण

हम क्रूर बल दृष्टिकोण . लागू कर सकते हैं , जो पहले पहले N नंबरों के सभी क्रमपरिवर्तन ढूंढ रहा है और फिर सभी व्युत्क्रमों की जाँच कर रहा है कि यह K के बराबर है या नहीं। यदि हाँ, तो परिणामी काउंटर को बढ़ाएँ।

कुशल दृष्टिकोण

इस दृष्टिकोण में, हमारे पास पहले एन प्राकृतिक संख्याओं के एन अंक हैं। उस संख्या के सभी क्रमपरिवर्तन की गणना कहीं और की जाती है, जहाँ से हम K क्रमपरिवर्तन की तलाश कर रहे हैं। इसे खोजने के लिए, हम सभी क्रमपरिवर्तनों में अगला नंबर Nth (सबसे बड़ा) डालेंगे और उन नंबरों की तलाश करेंगे जिनकी व्युत्क्रम संख्या K के बराबर है, इस संख्या को जोड़ने के बाद हमारे परिणाम में गिना जाना चाहिए। (एन -1) संख्याओं के ऐसे क्रमपरिवर्तन लेते हुए जिनमें (के - 3) उलटा नहीं है, हम नई संख्या को अंतिम से तीसरे सूचकांक पर स्थानांतरित कर देंगे। व्युत्क्रमों की संख्या K होगी, और find_permutations(N-1, K-3) हमारा उत्तर होगा। अन्य व्युत्क्रमों के लिए समान तर्क का उपयोग किया जा सकता है, और हम अंतिम उत्तर के रूप में उपरोक्त पुनरावृत्ति पर पहुंचेंगे।

इनपुट

#include <bits/stdc++.h>
using namespace std;
const int X = 100;
int a = 0;
int arr[X][X];
// recursive function
int find_permutations (int N_numbers, int K_inversion){
    if (N_numbers == 0){
      return 0;            // return 0 when N becomes 0
    }
    if (K_inversion == 0)
        return 1;            // return 1 when K becomes 1
    if (arr[N_numbers][K_inversion] != 0)
        return arr[N_numbers][K_inversion];
    int result = 0;
    for (int i = 0; i <= K_inversion; i++){

        if (i <= N_numbers - 1)
          result += find_permutations (N_numbers - 1, K_inversion - i);
    }
    arr[N_numbers][K_inversion] = result;
    return result;
}
// main function
int main (){
    int N, K;
    cin >> N;    // taking input from user
    cin >> K;
    cout << find_permutations (N, K);
    return 0;
}

आउटपुट

0

इनपुट - एन =4, के =3

आउटपुट -6

निष्कर्ष

इस लेख में, हम O(n * k) से K व्युत्क्रमों वाले क्रमपरिवर्तनों की संख्या ज्ञात करने के लिए एक समस्या का समाधान करते हैं समय जटिलता। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (सामान्य और कुशल) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे सी, जावा, पायथन और अन्य भाषाओं में लिख सकते हैं। आशा है कि आपको यह लेख मददगार लगा होगा।


  1. C++ का उपयोग करके एक स्ट्रिंग के सबस्ट्रिंग की संख्या ज्ञात करें

    इस लेख में, आप किसी दिए गए स्ट्रिंग में बनाए जा सकने वाले सबस्ट्रिंग (गैर-रिक्त) की संख्या को खोजने के तरीकों के बारे में जानेंगे। Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, &lsqu

  1. C++ . का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात कीजिए

    बिंदु X और Y के बीच मध्यवर्ती ट्रेन स्टेशनों की संख्या n है। गिनें कि अलग-अलग तरीकों से ट्रेनों को s स्टेशनों पर रुकने के लिए व्यवस्थित किया जा सकता है जैसे कि कोई भी दो स्टेशन एक दूसरे के बगल में नहीं हैं। तो इस लेख में, हम स्टॉपिंग स्टेशनों की संख्या का पता लगाने के लिए हर संभव तरीके की व्याख्या क

  1. C++ का उपयोग करके सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करें

    इस लेख में, हम एक सेट पर रिफ्लेक्सिव संबंधों की संख्या को खोजने के तरीकों की व्याख्या करेंगे। इस समस्या में, हमें संख्या n दी गई है, और n प्राकृत संख्याओं के समुच्चय पर, हमें प्रतिवर्ती संबंधों की संख्या निर्धारित करनी होगी। चिंतनशील संबंध − समुच्चय A में एक संबंध प्रतिवर्ती कहलाता है यदि (a, a) R