ধরুন আমাদের কাছে ধনাত্মক পূর্ণসংখ্যার একটি অ্যারে A আছে, আমরা বলতে পারি যে অ্যারেটি বর্গপূর্ণ যদি প্রতিটি জোড়া সন্নিহিত উপাদানের জন্য, তাদের যোগফল একটি নিখুঁত বর্গ হয়। আমাদের A-এর পারমুটেশনের সংখ্যা বের করতে হবে যেগুলো বর্গপূর্ণ। দুটি পারমুটেশন A1 এবং A2 একই হবে না যদি এবং শুধুমাত্র যদি কিছু সূচক i থাকে যেমন A1[i] A2[i] এর মতো নয়।
সুতরাং, যদি ইনপুটটি [3,30,6] এর মত হয়, তাহলে আউটপুট হবে 2, যেহেতু আমাদের দুটি পারমুটেশন যেমন [3,6,30], [30,6,3]।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন isSqr() সংজ্ঞায়িত করুন, এটি n,
লাগবে-
x :=n
এর বর্গমূল -
সত্য প্রত্যাবর্তন করুন যখন (x * x) n
এর মত হয়
-
-
একটি ফাংশন সল্ভ() সংজ্ঞায়িত করুন, এটি একটি অ্যারে, idx,
নেবে-
যদি idx a এর আকারের সমান হয়, তাহলে −
-
(গণনা 1 দ্বারা বৃদ্ধি করুন)
-
ফেরত
-
-
পরিদর্শন করা একটি সেট সংজ্ঞায়িত করুন
-
আরম্ভ করার জন্য i :=idx, যখন i
-
যদি (idx একই হয় 0 বা isSqr(a[idx - 1] + a[i])) এবং a[i] পরিদর্শনে না থাকে তাহলে −
-
swap(a[idx], a[i])
-
সমাধান করুন(a, idx + 1)
-
swap(a[idx], a[i])
-
ভিজিটেড
-এ একটি [i] ঢোকান
-
-
-
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
গণনা :=0
-
সমাধান (a, 0)
-
ফেরত গণনা
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int count;
bool isSqr(lli n){
lli x = sqrt(n);
return x * x == n;
}
void solve(vector<int>& a, int idx){
if (idx == a.size()) {
count++;
return;
}
set<int> visited;
for (int i = idx; i < a.size(); i++) {
if ((idx == 0 || isSqr(a[idx - 1] + a[i])) &&
!visited.count(a[i])) {
swap(a[idx], a[i]);
solve(a, idx + 1);
swap(a[idx], a[i]);
visited.insert(a[i]);
}
}
}
int numSquarefulPerms(vector<int>& a){
count = 0;
solve(a, 0);
return count;
}
};
main(){
Solution ob;
vector<int> v = {3,30,6};
cout << (ob.numSquarefulPerms(v));
} ইনপুট
{3,30,6} আউটপুট
2