Rearrange an array such that product of every two consecutive elements is a multiple of 4

Given an array arr[] of size N, the task is to rearrange the array elements such that for every index i(1 <= i <= N – 1), the product of arr[i] and arr[i – 1] is a multiple of 4.
Example: 

Input: arr[] = {1, 10, 100} 
Output: 1, 100, 10 
Explanation: 
1 * 100 is divisible by 4 
100 * 10 is divisible by 4

Input: arr[] = {2, 7, 1, 8, 2, 8} 
Output: 7, 8, 1, 8, 2, 2 

Naive Approach: 
The simplest approach to solve the problem is to generate all possible permutations of the array and for every permutation, check if the product of every two consecutive elements is a multiple of 4 or not. 

Time complexity: O(N^2 * N!) 
Auxiliary Space: O(N!)

Efficient Approach: 
Follow the steps below to optimize the above approach:



Illustration
arr[] = {1, 1, 1, 4, 4}
Step 0: four = 2, odd = 3
Step 1: {1 _ 1 _ 1}
Step 2: {1 4 1 4 1}

In this case, even elements that are not divisible by 4 exist in the array.

Illustration:
arr[] = {2, 7, 1, 8, 2, 8}
Step 1: four = 2, non_four = 2, odd = 2
Step 2: {_ 8 _ 8}
Step 3: {1 8 7 8}
Step 4: {1 8 7 8 2 2}

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to rearray array
// elements such that the product
// of every two consecutive
// elements is a multiple of 4
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to rearrange array
// elements such that the every
// two consecutive elements is
// a multiple of 4
void Permute(vector<int>& arr,
            int n)
{
 
    int odd = 0, four = 0;
    int non_four = 0;
 
    vector<int> ODD, FOUR,
        NON_FOUR;
 
    for (auto x : arr) {
 
        // If element is odd
        if (x & 1) {
            odd++;
            // Odd
            ODD.push_back(x);
        }
 
        // If element is divisible
        // by 4
        else if (x % 4 == 0) {
            four++;
            // Divisible by 4
            FOUR.push_back(x);
        }
 
        // If element is not
        // divisible by 4
        else {
            non_four++;
            // Even but not divisble
            // by 4
            NON_FOUR.push_back(x);
        }
    }
 
    // Condition for rearrangement
    // to be possible
    if (non_four == 0
        && four >= odd - 1) {
 
        int x = ODD.size();
        int y = FOUR.size();
        int i;
 
        // Print ODD[i] and FOUR[i]
        // consecutively
        for (i = 0; i < x; i++) {
            cout << ODD[i] << " ";
            if (i < y)
                cout << FOUR[i] << " ";
        }
 
        // Print the remaining
        // FOUR[i], if any
        while (i < y)
            cout << FOUR[i] << " ";
        cout << endl;
    }
 
    // Condition for rearrangement
    // to be possible
    else if (non_four > 0
            and four >= odd) {
 
        int x = ODD.size();
        int y = FOUR.size();
        int i;
 
        // Print ODD[i] and FOUR[i]
        // consecutively
        for (i = 0; i < x; i++) {
            cout << ODD[i] << " ";
            if (i < y)
                cout << FOUR[i] << " ";
        }
 
        // Print the remaining
        // FOUR[i], if any
        while (i < y)
            cout << FOUR[i] << " ";
 
        // Print the NON_FOUR[i]
        // elements at the end
        for (int j = 0;
            j < (int)NON_FOUR.size();
            j++)
            cout << NON_FOUR[j] << " ";
        cout << endl;
    }
    else
 
        // No possible configuration
        cout << "Not Possible" << endl;
}
 
// Driver Code
signed main()
{
 
    vector<int> arr = { 2, 7, 1,
                        8, 2, 8 };
    int N = sizeof(arr) / sizeof(arr);
    Permute(arr, N);
 
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to rearray array
// elements such that the product
// of every two consecutive
// elements is a multiple of
import java.io.*;
import java.util.*;
 
class GFG{
     
// Function to rearrange array
// elements such that the every
// two consecutive elements is
// a multiple of 4
public static void Permute(Vector<Integer> arr, int n)
{
    int odd = 0, four = 0;
    int non_four = 0;
 
    Vector<Integer> ODD = new Vector<Integer>();
    Vector<Integer> FOUR = new Vector<Integer>(n);
    Vector<Integer> NON_FOUR = new Vector<Integer>(n);
 
    for(int x : arr)
    {
         
        // If element is odd
        if (x % 2 != 0)
        {
            odd++;
             
            // Odd
            ODD.add(x);
        }
 
        // If element is divisible
        // by 4
        else if (x % 4 == 0)
        {
            four++;
             
            // Divisible by 4
            FOUR.add(x);
        }
 
        // If element is not
        // divisible by 4
        else
        {
            non_four++;
             
            // Even but not divisble
            // by 4
            NON_FOUR.add(x);
        }
    }
 
    // Condition for rearrangement
    // to be possible
    if (non_four == 0 && four >= odd - 1)
    {
        int x = ODD.size();
        int y = FOUR.size();
        int i;
 
        // Print ODD.get(i) and FOUR.get(i)
        // consecutively
        for(i = 0; i < x; i++)
        {
            System.out.print(ODD.get(i) + " ");
             
            if (i < y)
                System.out.print(FOUR.get(i) + " ");
        }
 
        // Print the remaining
        // FOUR.get(i), if any
        while (i < y)
            System.out.print(FOUR.get(i) + " ");
             
        System.out.println();
    }
 
    // Condition for rearrangement
    // to be possible
    else if (non_four > 0 && four >= odd)
    {
        int x = ODD.size();
        int y = FOUR.size();
        int i;
 
        // Print ODD.get(i) and FOUR.get(i)
        // consecutively
        for(i = 0; i < x; i++)
        {
            System.out.print(ODD.get(i) + " ");
             
            if (i < y)
                System.out.print(FOUR.get(i) + " ");
        }
 
        // Print the remaining
        // FOUR.get(i), if any
        while (i < y)
            System.out.print(FOUR.get(i) + " ");
 
        // Print the NON_FOUR.get(i)
        // elements at the end
        for(int j = 0; j < (int)NON_FOUR.size(); j++)
            System.out.print(NON_FOUR.get(j) + " ");
             
        System.out.println();
    }
    else
 
        // No possible configuration
        System.out.println("Not Possible");
}
 
// Driver Code
public static void main(String[] args)
{
    Vector<Integer> arr = new Vector<Integer>();
    arr.add(2);
    arr.add(7);
    arr.add(1);
    arr.add(8);
    arr.add(2);
    arr.add(8);
     
    Permute(arr, arr.size());
}
}
 
// This code is contributed by grand_master
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to rearray array
# elements such that the product
# of every two consecutive
# elements is a multiple of 4
 
# Function to rearrange array
# elements such that the every
# two consecutive elements is
# a multiple of 4
def Permute(arr, n):
     
    odd = 0
    four = 0
    non_four = 0
    ODD, FOUR, NON_FOUR = [], [], []
 
    for x in arr:
 
        # If element is odd
        if (x & 1):
            odd += 1
             
            # Odd
            ODD.append(x)
             
        # If element is divisible
        # by 4
        elif (x % 4 == 0):
            four += 1
             
            # Divisible by 4
            FOUR.append(x)
 
        # If element is not
        # divisible by 4
        else:
            non_four += 1
             
            # Even but not divisble
            # by 4
            NON_FOUR.append(x)
             
    # Condition for rearrangement
    # to be possible
    if (non_four == 0 and four >= odd - 1):
        x = len(ODD)
        y = len(FOUR)
        i = 0
 
        # Print ODD[i] and FOUR[i]
        # consecutively
        while i < x:
            print(ODD[i], end = " ")
            if (i < y):
                print(FOUR[i], end = " ")
 
        # Print the remaining
        # FOUR[i], if any
        while (i < y):
            print(FOUR[i], end = " ")
            i += 1
        print()
 
    # Condition for rearrangement
    # to be possible
    elif (non_four > 0 and four >= odd):
        x = len(ODD)
        y = len(FOUR)
        i = 0
 
        # Print ODD[i] and FOUR[i]
        # consecutively
        while i < x:
            print(ODD[i], end = " ")
            if (i < y):
                print(FOUR[i], end = " ")
            i += 1
 
        # Print the remaining
        # FOUR[i], if any
        while (i < y):
            print(FOUR[i], end = " ")
            i += 1
 
        # Print the NON_FOUR[i]
        # elements at the end
        for j in NON_FOUR:
            print(j, end = " ")
    else:
 
        # No possible configuration
        print("Not Possible")
 
# Driver Code
if __name__ == '__main__':
 
    arr = [ 2, 7, 1, 8, 2, 8 ]
    N = len(arr)
     
    Permute(arr, N)
 
# This code is contributed by mohit kumar 29
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to rearray array
// elements such that the product
// of every two consecutive
// elements is a multiple of
using System;
using System.Collections.Generic;
class GFG{
     
// Function to rearrange array
// elements such that the every
// two consecutive elements is
// a multiple of 4
public static void Permute(List<int> arr,
                           int n)
{
  int odd = 0, four = 0;
  int non_four = 0;
 
  List<int> ODD =
            new List<int>();
  List<int> FOUR =
            new List<int>(n);
  List<int> NON_FOUR =
            new List<int>(n);
 
  foreach(int x in arr)
  {
    // If element is odd
    if (x % 2 != 0)
    {
      odd++;
 
      // Odd
      ODD.Add(x);
    }
 
    // If element is divisible
    // by 4
    else if (x % 4 == 0)
    {
      four++;
 
      // Divisible by 4
      FOUR.Add(x);
    }
 
    // If element is not
    // divisible by 4
    else
    {
      non_four++;
 
      // Even but not divisble
      // by 4
      NON_FOUR.Add(x);
    }
  }
 
  // Condition for rearrangement
  // to be possible
  if (non_four == 0 &&
      four >= odd - 1)
  {
    int x = ODD.Count;
    int y = FOUR.Count;
    int i;
 
    // Print ODD[i] and FOUR[i]
    // consecutively
    for(i = 0; i < x; i++)
    {
      Console.Write(ODD[i] + " ");
 
      if (i < y)
        Console.Write(FOUR[i] + " ");
    }
 
    // Print the remaining
    // FOUR[i], if any
    while (i < y)
      Console.Write(FOUR[i] + " ");
 
    Console.WriteLine();
  }
 
  // Condition for rearrangement
  // to be possible
  else if (non_four > 0 &&
           four >= odd)
  {
    int x = ODD.Count;
    int y = FOUR.Count;
    int i;
 
    // Print ODD[i] and FOUR[i]
    // consecutively
    for(i = 0; i < x; i++)
    {
      Console.Write(ODD[i] + " ");
 
      if (i < y)
        Console.Write(FOUR[i] + " ");
    }
 
    // Print the remaining
    // FOUR[i], if any
    while (i < y)
      Console.Write(FOUR[i] + " ");
 
    // Print the NON_FOUR[i]
    // elements at the end
    for(int j = 0;
            j < (int)NON_FOUR.Count; j++)
      Console.Write(NON_FOUR[j] + " ");
 
    Console.WriteLine();
  }
  else
 
    // No possible configuration
    Console.WriteLine("Not Possible");
}
 
// Driver Code
public static void Main(String[] args)
{
  List<int> arr = new List<int>();
  arr.Add(2);
  arr.Add(7);
  arr.Add(1);
  arr.Add(8);
  arr.Add(2);
  arr.Add(8);
 
  Permute(arr, arr.Count);
}
}
 
// This code is contributed by 29AjayKumar
chevron_right

Output:

7 8 1 8 2 2





Time Complexity: O(N)
Auxiliary Space: O(1)




Recommended Posts:


Jadavpur University IT Undergrad 22

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :