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

सी++ में संगीत प्लेलिस्ट की संख्या

मान लीजिए हमारे पास एक म्यूजिक प्लेयर है, जिसमें एन अलग-अलग गाने हैं और हम अपनी यात्रा के दौरान एल गाने सुनना चाहते हैं। इसलिए हमें एक प्लेलिस्ट बनानी होगी ताकि वह इन शर्तों को पूरा करे -

  • हर गाना कम से कम एक बार बजाया जाता है

  • एक गाना फिर से तभी चलाया जा सकता है जब K अन्य गाने बजाए गए हों।

हमें संभावित प्लेलिस्ट की संख्या का पता लगाना है। उत्तर बहुत बड़ा हो सकता है, इसलिए हम इसे मॉडुलो 10^9 + 7 लौटा देंगे।

इसलिए, यदि इनपुट एन =2, एल =3, के =0 जैसा है, तो आउटपुट 6 होगा, क्योंकि 6 संभावित प्लेलिस्ट हैं [1,1,2], [1,2,1], [2 ,1,1], [2,2,1], [2,1,2], [1,2,2]।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • फ़ंक्शन ऐड () को परिभाषित करें, इसमें a, b,

    . लगेगा
  • वापसी ((एक मॉड एम) + (बी मॉड एम)) मॉड एम

  • एक फ़ंक्शन उप () को परिभाषित करें, इसमें a, b,

    . लगेगा
  • वापसी ((एक मॉड एम) - (बी मॉड एम) + एम) मॉड एम

  • फ़ंक्शन mul() को परिभाषित करें, इसमें a, b,

    . लगेगा
  • वापसी ((एक मॉड एम) * (बी मॉड एम)) मॉड एम

  • मुख्य विधि से, निम्न कार्य करें -

  • dp(L + 1) x (N + 1)

    आकार का एक 2d सरणी बनाएं
  • डीपी [0, 0] :=1

  • इनिशियलाइज़ i :=1 के लिए, जब i <=L, अपडेट करें (i 1 से बढ़ाएँ), करें -

    • इनिशियलाइज़ j :=1 के लिए, जब j <=N, अपडेट करें (j को 1 से बढ़ाएँ), करें -

      • dp[i, j] :=mul(dp[i-1, j-1], (N - (j-1)))

      • अगर j> K, तो -

        • dp[i, j] :=add(dp[i, j], mul(dp[i - 1, j], j - K))

  • वापसी डीपी [एल, एन]

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 7;
typedef long long int lli;
class Solution {
   public:
   int add(lli a, lli b){
      return ((a % m) + (b % m)) % m;
   }
   int sub(lli a, lli b){
      return ((a % m) - (b % m) + m) % m;
   }
   int mul(lli a, lli b){
      return ((a % m) * (b % m)) % m;
   }
   int numMusicPlaylists(int N, int L, int K) {
      vector < vector <int> > dp(L + 1, vector <int>(N + 1));
      dp[0][0] = 1;
      for(int i = 1; i <= L; i++){
         for(int j = 1; j <= N; j++){
            dp[i][j] = mul(dp[i - 1][j - 1], (N - (j - 1)));
            if(j > K){
               dp[i][j] = add(dp[i][j], mul(dp[i - 1][j], j -
               K));
            }
         }
      }
      return dp[L][N];
   }
};
main(){
   Solution ob;
   cout << (ob.numMusicPlaylists(2, 3, 0));
}

इनपुट

2,3,0

आउटपुट

6

  1. C++ में मितव्ययी संख्या

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया जाता है। हमारा कार्य यह जाँचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या - एक संख्या जिसके अंकों की संख्या दी गई संख्या के अभाज्य गुणनखंड में अंकों की संख्या से अधिक है। उदाहरण − 625, संख्या 625 का अभाज्

  1. सी++ पेंटाटोप नंबर

    पास्कल के त्रिभुज में एक पंचकोण संख्या को पाँचवीं संख्या के रूप में वर्णित किया गया है। अब, जैसा कि आप जानते हैं, यह पांचवीं संख्या है, तो इसका मतलब है कि हमारे पास पास्कल के त्रिकोण में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है। पास्कल त्रिभुज की

  1. C++ में एडम नंबर

    इस खंड में हम देखेंगे कि एक प्रोग्राम कैसे लिखा जाता है जो यह जांच सकता है कि दी गई संख्या एडम नंबर है या नहीं। कोड में गोता लगाने से पहले आइए देखें कि एडम नंबर क्या है? आदम संख्या एक संख्या है मान लीजिए n, तो यदि n का वर्ग और n के विपरीत का वर्ग एक-दूसरे के विपरीत हों, तो वह संख्या आदम संख्या होती