Given an array **arr[]** of size **N**, the task is to check if it is possible to split the array **arr[]** into different subsequences of equal size such that each element of the subsequence are equal. If found to be true, then print **“YES”**. Otherwise, print **“NO”**.

**Examples:**

Input:arr[] = {1, 2, 3, 4, 4, 3, 2, 1}Output:YESExplanation:Possible partition: {1, 1}, {2, 2}, {3, 3}, {4, 4}.

Input:arr[] = {1, 1, 1, 2, 2, 2, 3, 3}Output:NO

**Approach: **The idea is based on the following observation: Let the frequency of **arr[i]** be **C _{i}**, then these elements must be broken down into subsequences of

**X**such that

**C**. This must be YES for every index

_{i}% X = 0**i**. To satisfy this, the value of

**X**should be equal to the greatest common divisor(GCD) of all

**C**. If

_{i }(1≤i≤N)**X**is greater than 1, then print YES otherwise print NO.

Follow the steps below to solve the problem:

- Create a hashmap,
**mp**, to store the frequencies of all the elements of the array,**arr[]**. - Store the greatest common divisor of all the frequencies in
**mp**in a variable**X**. - If
**X**is greater than 1, then the answer is YES. - Otherwise, the answer is NO.

Below is the implementation of the above approach:

## C++

`// C++ program to implement` `// the above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to find the GCD` `// of two numbers a and b` `int` `gcd(` `int` `a, ` `int` `b)` `{` ` ` `if` `(b == 0)` ` ` `return` `a;` ` ` `return` `gcd(b, a % b);` `}` `// Function to check if it is possible to` `// split the array into equal length subsequences` `// such that all elements in the subsequence are equal` `void` `splitArray(` `int` `arr[], ` `int` `N)` `{` ` ` `// Store frequencies of` ` ` `// array elements` ` ` `map<` `int` `, ` `int` `> mp;` ` ` `// Traverse the array` ` ` `for` `(` `int` `i = 0; i < N; i++) {` ` ` `// Update frequency of arr[i]` ` ` `mp[arr[i]]++;` ` ` `}` ` ` `// Store the GCD of frequencies` ` ` `// of all array elements` ` ` `int` `G = 0;` ` ` `// Traverse the map` ` ` `for` `(` `auto` `i : mp) {` ` ` `// Update GCD` ` ` `G = gcd(G, i.second);` ` ` `}` ` ` `// If the GCD is greater than 1,` ` ` `// print YES otherwise print NO` ` ` `if` `(G > 1)` ` ` `cout << ` `"YES"` `;` ` ` `else` ` ` `cout << ` `"NO"` `;` `}` `// Driver Code` `int` `main()` `{` ` ` `// Given array` ` ` `int` `arr[] = { 1, 2, 3, 4, 4, 3, 2, 1 };` ` ` `// Store the size of the array` ` ` `int` `n = ` `sizeof` `(arr) / ` `sizeof` `(arr[0]);` ` ` `splitArray(arr, n);` ` ` `return` `0;` `}` |

*chevron_right*

*filter_none*

## Java

`// Java program to implement` `// the above approach` `import` `java.io.*;` `import` `java.lang.*;` `import` `java.util.*;` `class` `GFG ` `{` ` ` `// Function to find the GCD` ` ` `// of two numbers a and b` ` ` `int` `gcd(` `int` `a, ` `int` `b)` ` ` `{` ` ` `if` `(b == ` `0` `)` ` ` `return` `a;` ` ` `return` `gcd(b, a % b);` ` ` `}` ` ` `// Function to check if it is possible to` ` ` `// split the array into equal length subsequences` ` ` `// such that all elements in the subsequence are equal` ` ` `void` `splitArray(` `int` `arr[], ` `int` `N)` ` ` `{` ` ` `// Store frequencies of` ` ` `// array elements` ` ` `TreeMap<Integer, Integer> mp` ` ` `= ` `new` `TreeMap<Integer, Integer>();` ` ` `// Traverse the array` ` ` `for` `(` `int` `i = ` `0` `; i < N; i++)` ` ` `{` ` ` `// Update frequency of arr[i]` ` ` `if` `(mp.containsKey(arr[i])) ` ` ` `{` ` ` `mp.put(arr[i], mp.get(arr[i]) + ` `1` `);` ` ` `}` ` ` `else` ` ` `{` ` ` `mp.put(arr[i], ` `1` `);` ` ` `}` ` ` `}` ` ` `// Store the GCD of frequencies` ` ` `// of all array elements` ` ` `int` `G = ` `0` `;` ` ` `// Traverse the map` ` ` `for` `(Map.Entry<Integer, Integer> m :` ` ` `mp.entrySet())` ` ` `{` ` ` ` ` `// update gcd` ` ` `Integer i = m.getValue();` ` ` `G = gcd(G, i.intValue());` ` ` `}` ` ` `// If the GCD is greater than 1,` ` ` `// print YES otherwise print NO` ` ` `if` `(G > ` `1` `)` ` ` `System.out.print(` `"YES"` `);` ` ` `else` ` ` `System.out.print(` `"NO"` `);` ` ` `}` ` ` `// Driver Code` ` ` `public` `static` `void` `main(String[] args)` ` ` `{` ` ` `// Given array` ` ` `int` `[] arr = ` `new` `int` `[] { ` `1` `, ` `2` `, ` `3` `, ` `4` `, ` `4` `, ` `3` `, ` `2` `, ` `1` `};` ` ` `// Store the size of the array` ` ` `int` `n = arr.length;` ` ` `new` `GFG().splitArray(arr, n);` ` ` `}` `}` `// This code is contributed by abhishekgiri1` |

*chevron_right*

*filter_none*

**Output:**

YES

**Time Complexity:** O(N * log(N))**Auxiliary Space:** O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.