ধরুন আমাদের 1 থেকে N পূর্ণসংখ্যা রয়েছে৷ আমরা একটি সুন্দর বিন্যাসকে একটি অ্যারে হিসাবে সংজ্ঞায়িত করব যা এই এন সংখ্যাগুলি দ্বারা সম্পূর্ণরূপে নির্মিত হয় যদি এই অ্যারেতে ith অবস্থানের (1 <=i <=N) জন্য নিম্নলিখিতগুলির একটি সত্য হয় −
- ith অবস্থানে থাকা সংখ্যাটিকে i দ্বারা ভাগ করা যায়।
- i ith অবস্থানে সংখ্যা দ্বারা বিভাজ্য।
সুতরাং যদি ইনপুট 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 দ্বারা বিভাজ্য৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি পুনরাবৃত্ত পদ্ধতি সংজ্ঞায়িত করুন solve(), যা ভিজিট করা অ্যারে, এন্ড এবং pos নেবে। পোস প্রাথমিকভাবে 1।
- যদি pos =end + 1 হয়, তাহলে উত্তর 1 দ্বারা বাড়ান এবং ফেরত দিন
- আমি রেঞ্জ 1 থেকে শেষ পর্যন্ত
- i
- আমি ভিজিট করেছি হিসেবে চিহ্নিত করুন
- সমাধান (ভিজিট করা, শেষ, pos + 1)
- আমাকে দেখা হয়নি বলে চিহ্নিত করুন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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