Sum of width (max and min diff) of all Subsequences

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

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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:





Below is the implementation of above approach:

C++

 // CPP implementation of above approach  #include  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

 

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 DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.

Improved By : chitranayal, Mithun Kumar