मान लीजिए कि हमारे पास एक संख्या n है, तो हमें यह गिनना होगा कि इन नियमों का उपयोग करके n लंबाई के कितने तार बनाए जा सकते हैं - प्रत्येक वर्ण एक लोअर केस स्वर है प्रत्येक स्वर 'a' के बाद केवल 'e' हो सकता है। प्रत्येक स्वर 'ई' के बाद केवल 'ए' या 'आई' हो सकता है। प्रत्येक स्वर 'i' के बाद दूसरा 'i' नहीं हो सकता है। प्रत्येक स्वर 'ओ' के बाद केवल 'मैं' या 'यू' हो सकता है। प्रत्येक स्वर 'यू' के बाद केवल 'ए' हो सकता है। उत्तर बहुत बड़ा हो सकता है, इसलिए हमें उत्तर मॉड्यूल 10^9 + 7 मिलेगा।
इसलिए, यदि इनपुट 2 की तरह है, तो आउटपुट 10 होगा, ऐसा इसलिए है क्योंकि सभी संभावित तार "एई", "ईए", "ईआई", "आईए", "यानी", "आईओ", "आईयू" हैं। , "ओई", "ओयू", "यूए"।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एम =1^9 + 7
-
फ़ंक्शन ऐड () को परिभाषित करें, इसमें a, b,
. लगेगा -
वापसी ((एक मॉड एम) + (बी मॉड एम)) मॉड एम
-
फ़ंक्शन mul() को परिभाषित करें, इसमें a, b,
. लगेगा -
वापसी ((एक मॉड एम) * (बी मॉड एम)) मॉड एम
-
एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें n लगेगा,
-
आकार की एक सरणी ए परिभाषित करें:5 x 5:={{0,1,0,0,0},{1,0,1,0,0},{1,1,0,1,1},{ 0,0,1,0,1},{1,0,0,0,0}}
-
आकार का एक सरणी परिणाम परिभाषित करें:5 x 5.
-
इनिशियलाइज़ करने के लिए i:=0, जब i <5, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
इनिशियलाइज़ j :=0 के लिए, जब j <5, अपडेट करें (j को 1 से बढ़ाएँ), करें -
-
यदि मैं j के समान है, तो परिणाम[i, j] :=1
-
अन्यथा, परिणाम [i, j] :=0
-
-
-
(n से 1 घटाएं)
-
इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -
-
परिणाम =परिणाम * ए
-
-
योग :=0
-
इनिशियलाइज़ करने के लिए i:=0, जब i <5, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
इनिशियलाइज़ j :=0 के लिए, जब j <5, अपडेट करें (j को 1 से बढ़ाएँ), करें -
-
योग:=जोड़ें (परिणाम [i, j], योग)
-
-
-
वापसी राशि
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli m = 1e9+7; lli add(lli a, lli b){ return ((a%m) + (b%m))%m; } lli mul(lli a, lli b){ return ((a%m) * (b%m))%m; } class Solution { public: void multiply(lli A[5][5], lli B[5][5]){ lli C[5][5]; for(lli i =0;i<5;i++){ for(lli j=0;j<5;j++){ lli temp =0; for(lli k =0;k<5;k++){ temp = add(temp,mul(A[i][k],B[k][j])); } C[i][j] = temp; } } for(lli i =0;i<5;i++){ for(lli j =0;j<5;j++){ A[i][j] = C[i][j]; } } } lli solve(lli n){ lli A[5][5] = { { 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 0 }, { 1, 1, 0, 1, 1 }, { 0, 0, 1, 0, 1 }, { 1, 0, 0, 0, 0 } }; lli result[5][5]; for (lli i = 0; i < 5; i++) { for (lli j = 0; j < 5; j++) { if (i == j) result[i][j] = 1; else result[i][j] = 0; } } n--; for (int i = 1; i <= n; i++) multiply(result, A); lli sum = 0; for (lli i = 0; i < 5; i++) { for (lli j = 0; j < 5; j++) { sum = add(result[i][j], sum); } } return sum; } int countVowelPermutation(int n) { return solve(n); } }; main(){ Solution ob; cout << (ob.countVowelPermutation(2)); }
इनपुट
2
आउटपुट
10