ধরুন আমাদের কাছে ধনাত্মক পূর্ণসংখ্যার একটি অ্যারে 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