- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Number of Squareful Arrays in C++
Suppose we have an array A of positive integers, we can say that array is squareful if for every pair of adjacent elements, their sum is a perfect square. We have to find the number of permutations of A that are squareful. Two permutations A1 and A2 will not be same if and only if there is some index i such that A1[i] not same as A2[i].
So, if the input is like [3,30,6], then the output will be 2, as we have two permutations like [3,6,30], [30,6,3].
To solve this, we will follow these steps −
Define a function isSqr(), this will take n,
x := square root of n
return true when (x * x) is same as n
Define a function solve(), this will take an array a, idx,
if idx is same as size of a, then −
(increase count by 1)
return
Define one set visited
for initialize i := idx, when i < size of a, update (increase i by 1), do −
if (idx is same as 0 or isSqr(a[idx - 1] + a[i])) and a[i] is not in visited then −
swap(a[idx], a[i])
solve(a, idx + 1)
swap(a[idx], a[i])
insert a[i] into visited
From the main method, do the following −
count := 0
solve(a, 0)
return count
Let us see the following implementation to get better understanding −
Example
#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)); }
Input
{3,30,6}
Output
2