मान लीजिए कि हमारे पास 1 से N तक N पूर्णांक हैं। हम एक सुंदर व्यवस्था को एक सरणी के रूप में परिभाषित करेंगे जो इन N संख्याओं द्वारा पूरी तरह से बनाई गई है यदि निम्न में से एक इस सरणी में ith स्थिति (1 <=i <=N) के लिए सही है। -
- वें स्थान की संख्या को i से विभाजित किया जा सकता है।
- i वें स्थान पर संख्या से विभाज्य है।
तो अगर इनपुट 2 है, तो परिणाम भी 2 होगा, क्योंकि पहली सुंदर व्यवस्था [1,2] है। यहाँ पहली स्थिति (i=1) की संख्या 1 है, और 1 i (i=1) से विभाज्य है। फिर दूसरे स्थान पर संख्या (i=2) 2 है, और 2 i (i=2) से विभाज्य है। दूसरी सुंदर व्यवस्था है [2, 1]:यहाँ पहली स्थिति (i=1) पर संख्या 2 है, और 2 i (i=1) से विभाज्य है। फिर दूसरे स्थान पर संख्या (i=2) 1 है और i (i=2) 1 से विभाज्य है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक पुनरावर्ती विधि हल () को परिभाषित करें, जो विज़िट की गई सरणी, अंत और स्थिति लेगी। स्थिति शुरू में 1 है।
- अगर pos =end + 1 है, तो ans को 1 से बढ़ा दें और वापस आ जाएं
- मैं श्रेणी 1 से अंत तक के लिए
- यदि मैं विज़िट नहीं किया गया है और पॉज़ 0 से विभाज्य है या मैं 0 से विभाज्य है, तो
- देखे गए के रूप में चिह्नित करें
- समाधान (विज़िट, एंड, पॉज़ + 1)
- मैं नहीं देखा के रूप में चिह्नित करें
- यदि मैं विज़िट नहीं किया गया है और पॉज़ 0 से विभाज्य है या मैं 0 से विभाज्य है, तो
- मुख्य विधि से, निम्न कार्य करें -
- उत्तर:=0, विज़िट की गई एक सरणी बनाएं
- कॉल सॉल्व (विज़िट, N, 1)r
- उत्तर दें।
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int ans;
void solve(vector <bool>& visited, int end, int pos = 1){
if(pos == end + 1){
ans++;
return;
}
for(int i = 1; i <= end; i++){
if(!visited[i] && (pos % i == 0 || i % pos == 0)){
visited[i] = true;
solve(visited, end, pos + 1);
visited[i] = false;
}
}
}
int countArrangement(int N) {
ans = 0;
vector <bool> visited(N);
solve(visited, N);
return ans;
}
};
main(){
Solution ob;
cout << (ob.countArrangement(2));
} इनपुट
2
आउटपुट
2