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 : 87Input : 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:
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 ?> |
87
Time Complexity: O(N*log(N)), where N is the length of A.
Recommended Posts:
- Number of Subsequences with Even and Odd Sum | Set 2
- Number of Subsequences with Even and Odd Sum
- Powers of two and subsequences
- Number of subsequences with zero sum
- Sum of all subsequences of an array
- Sum of all subsequences of a number
- Radius of the circle when the width and height of an arc is given
- Print all subsequences of a string
- Count of 'GFG' Subsequences in the given string
- Count all subsequences having product less than K
- Generating all possible Subsequences using Recursion
- Number of subsequences of the form a^i b^j c^k
- Count Distinct Subsequences
- Count all increasing subsequences
- Number of K length subsequences with minimum sum
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.