Skip to content
Related Articles

Related Articles

Sum of width (max and min diff) of all Subsequences
  • Difficulty Level : Hard
  • Last Updated : 20 Nov, 2018

Given an array A[] of integers. The task is to return the sum of the width of all subsequences of A. For any sequence S, the width of S is the difference between the maximum and minimum elements of S.

Note: Since the answer can be large, print the answer modulo 10^9 + 7.

Examples:

Input : A[] = {1, 3, 2}
Output : 6
Subsequences are {1}, {2}, {3}, {1, 3}, {1, 2} {3, 2} and {1, 3, 2}. Widths are 0, 0, 0, 2, 1, 1 and 2 respectively. Sum of widths is 6.

Input : A[] = [5, 6, 4, 3, 8]
Output : 87



Input : A[] = [1, 2, 3, 4, 5, 6, 7]
Output : 522

The idea is to first, sort the array as sorting the array won’t affect the final answer. After sorting, this allows us to know that the number of subsequences with minimum A[i] and maximum A[j] will be 2j-i-1.

Hence our answer boils down to finding:

 
\sum_{j>i}(2^{j-i-1})(A_{j}-A_{i})

= (\sum_{i=0}^{n-2}\sum_{j=i+1}^{n-1}(2^{j-i-1})(A_{j}))-(\sum_{i=0}^{n-2}\sum_{j=i+1}^{n-1}(2^{j-i-1})(A_{i})) 

= ((2^{0}A_{1}+2^{1}A_{2}+2^{2}A_{3}+...)+(2^{0}A_{2}+2^{1}A_{3}+2^{2}A_{4}+...)+(2^{0}A_{3}+2^{1}A_{4}+2^{2}A_{5}+...)+...)-      (\sum_{i=0}^{n-2}(2^{0}+2^{1}+...+2^{N-i-2})A_{i}+...)

= (\sum_{j=1}^{n-1}(2^{j}-1)A_{j})-(\sum_{i=0}^{n-2}(2^{N-i-1}-1)A_{i})

= \sum_{i=0}^{n-1}((2^{i}-1)A_{i}-(2^{N-i-1}-1)A_{i})

= \sum_{i=0}^{n-1}(2^{i}-2^{N-i-1})A_{i}

Below is the implementation of above approach:

C++




// CPP implementation of above approach
#include <bits/stdc++.h>
using namespace std;
  
#define MOD 1000000007
  
// Function to return sum of width of all subsets
int SubseqWidths(int A[], int n)
{
    // Sort the array
    sort(A, A + n);
  
    int pow2[n];
    pow2[0] = 1;
  
    for (int i = 1; i < n; ++i)
        pow2[i] = (pow2[i - 1] * 2) % MOD;
  
    int ans = 0;
  
    for (int i = 0; i < n; ++i)
        ans = (ans + (pow2[i] - pow2[n - 1 - i]) * A[i]) % MOD;
  
    return ans;
}
  
// Driver program
int main()
{
    int A[] = { 5, 6, 4, 3, 8 };
  
    int n = sizeof(A) / sizeof(A[0]);
  
    cout << SubseqWidths(A, n);
  
    return 0;
}

Java




// Java implementation of above approach
import java.util.Arrays; 
  
class GFG{
static int MOD=1000000007;
  
// Function to return sum of width of all subsets
static int SubseqWidths(int[] A, int n)
{
    // Sort the array
    Arrays.sort(A);
  
    int[] pow2=new int[n];
    pow2[0] = 1;
  
    for (int i = 1; i < n; ++i)
        pow2[i] = (pow2[i - 1] * 2) % MOD;
  
    int ans = 0;
  
    for (int i = 0; i < n; ++i)
        ans = (ans + (pow2[i] - 
                pow2[n - 1 - i]) * A[i]) % MOD;
  
    return ans;
}
  
// Driver program
public static void main(String[] args)
{
    int[] A = new int[]{ 5, 6, 4, 3, 8 };
  
    int n = A.length;
  
    System.out.println(SubseqWidths(A, n));
}
}
// This code is contributed by mits

Python




# Python3 implementation of above approach
  
# Function to return sum of width of all subsets
def SubseqWidths(A):
    MOD = 10**9 + 7
    N = len(A)
    A.sort()
  
    pow2 = [1]
    for i in range(1, N):
        pow2.append(pow2[-1] * 2 % MOD)
  
    ans = 0
    for i, x in enumerate(A):
        ans = (ans + (pow2[i] - pow2[N - 1 - i]) * x) % MOD
    return ans
  
  
# Driver program
A = [5, 6, 4, 3, 8]
  
print(SubseqWidths(A))

C#




// C# implementation of above approach
using System;
  
class GFG
{
static int MOD = 1000000007;
  
// Function to return sum of 
// width of all subsets
static int SubseqWidths(int[] A, int n)
{
    // Sort the array
    Array.Sort(A);
  
    int[] pow2 = new int[n];
    pow2[0] = 1;
  
    for (int i = 1; i < n; ++i)
        pow2[i] = (pow2[i - 1] * 2) % MOD;
  
    int ans = 0;
  
    for (int i = 0; i < n; ++i)
        ans = (ans + (pow2[i] - 
                       pow2[n - 1 - i]) * 
                       A[i]) % MOD;
  
    return ans;
}
  
// Driver Code
static void Main()
{
    int[] A = new int[]{ 5, 6, 4, 3, 8 };
  
    int n = A.Length;
      
    Console.WriteLine(SubseqWidths(A, n));
}
}
  
// This code is contributed by mits

PHP




<?php 
// PHP implementation of above approach
$MOD = 1000000007;
  
// Function to return sum 
// of width of all subsets
function SubseqWidths(&$A, $n)
{
    global $MOD;
      
    // Sort the array
    sort($A);
  
    $pow2 = array_fill(0, $n, NULL);
    $pow2[0] = 1;
  
    for ($i = 1; $i < $n; ++$i)
        $pow2[$i] = ($pow2[$i - 1] * 2) % $MOD;
  
    $ans = 0;
  
    for ($i = 0; $i < $n; ++$i)
        $ans = ($ans + ($pow2[$i] - 
                        $pow2[$n - 1 - $i]) * 
                              $A[$i]) % $MOD;
  
    return $ans;
}
  
// Driver Code
$A = array(5, 6, 4, 3, 8 );
  
$n = sizeof($A);
  
echo SubseqWidths($A, $n);
  
// This code is contributed 
// by ChitraNayal
?>
Output:
87

Time Complexity: O(N*log(N)), where N is the length of A.

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :