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

 Live Demo

#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
Updated on: 2020-06-04T09:48:04+05:30

321 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements