Last Updated: 2 Aug, 2020

Count Subsequences

Moderate
Asked in companies
Goldman SachsHCL TechnologiesOracle

Problem statement

You have been given an integer array/list 'ARR' of size 'N'. Your task is to return the total number of those subsequences of the array in which all the elements are equal.

A subsequence of a given array is an array generated by deleting some elements of the given array with the order of elements in the subsequence remaining the same as the order of elements in the array.

Note :
As this value might be large, print it modulo 10^9 + 7
Input format :
The first line contains an integer 'T' which denotes the number of test cases. Then the test cases follow :

The first line of each test case contains an integer 'N' representing the size of the array/list.

The second line contains 'N' single space - separated integers representing the elements of the array.
Output Format :
For each test case, print the total number of subsequences in which all elements are equal.

The output of each test case will be printed in a separate line.
Note :
You don't need to print anything. It has already been taken care of. Just implement the given function.
Constraints :
1 <= T <= 100
1 <= N <= 10^5
0 <= ARR[i] <= 10^9

Time Limit : 1 sec

Approaches

01 Approach

The idea is to generate all the subsequences and check whether the elements present are equal or not.

 

Here is the algorithm :

 

  1. Generate all the subsequences of the given array.
  2. Maintain a variable ‘COUNT’ which stores the total number of subsequences in which all the elements are equal.
  3. Iterate over each of the generated subsequences.
    1. In case all the elements of the current subsequence are equal, we increment ‘COUNT’.
  4. After, iterating over all the subsequences, the value of ‘COUNT’ is the answer that we are looking for.

02 Approach

In this approach, we will calculate the contribution of each distinct element to the answer. For example, if we had ‘k’ occurrences of an element in the array, we will be able to form :

  1. kC1 subsequences of length 1
  2. kC2 subsequences of length 2
  3. kC3 subsequences of length 3

   .

   .

   .

   K.  kCk  subsequences of length k

Hence the contribution of this element to the answer = kC1 + kC2 + kC3 … + kCk = (2^k) - 1

So, the contribution of each distinct element would be equal to (2 ^ FREQ) - 1. Where ‘FREQ’ is the frequency of that element in the array.

 

Here is the algorithm :

 

  1. Store the frequency of each element in a hashmap (say, ‘FREQ’).
  2. Maintain a variable ‘RESULT’ which stores the final answer.
  3. For each element present in the hashmap,
    1. Calculate the value of (2^eleCount - 1) % MOD, ‘eleCount’ is frequency of current element.
    2. Add the above value to ‘RESULT’
  4. The final answer is the value of ‘RESULT’ after we are done iterating over all the elements of the hashmap.