Given an array arr[] of size N. The task is to find the sum of arr[i] % arr[j] for all valid pairs. Answer can be large. So, output answer modulo 1000000007
Examples:
Input: arr[] = {1, 2, 3}
Output: 5
(1 % 1) + (1 % 2) + (1 % 3) + (2 % 1) + (2 % 2)
+ (2 % 3) + (3 % 1) + (3 % 2) + (3 % 3) = 5
Input: arr[] = {1, 2, 4, 4, 4}
Output: 10
Approach: Store the frequency of each element and run a nested loop on the frequency array and find the required answer.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define mod (int)(1e9 + 7) // Function to return the sum of (a[i] % a[j]) // for all valid pairs int Sum_Modulo( int a[], int n) { int max = *max_element(a, a + n); // To store the frequency of each element int cnt[max + 1] = { 0 }; // Store the frequency of each element for ( int i = 0; i < n; i++) cnt[a[i]]++; // To store the required answer long long ans = 0; // For all valid pairs for ( int i = 1; i <= max; i++) { for ( int j = 1; j <= max; j++) { // Update the count ans = ans + cnt[i] * cnt[j] * (i % j); ans = ans % mod; } } return ( int )(ans); } // Driver code int main() { int a[] = { 1, 2, 3 }; int n = sizeof (a) / sizeof (a[0]); cout << Sum_Modulo(a, n); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { static int mod = ( int )(1e9 + 7 ); // Function to return the sum of (a[i] % a[j]) // for all valid pairs static int Sum_Modulo( int a[], int n) { int max = Arrays.stream(a).max().getAsInt(); // To store the frequency of each element int []cnt= new int [max + 1 ]; // Store the frequency of each element for ( int i = 0 ; i < n; i++) cnt[a[i]]++; // To store the required answer long ans = 0 ; // For all valid pairs for ( int i = 1 ; i <= max; i++) { for ( int j = 1 ; j <= max; j++) { // Update the count ans = ans + cnt[i] * cnt[j] * (i % j); ans = ans % mod; } } return ( int )(ans); } // Driver code public static void main(String[] args) { int a[] = { 1 , 2 , 3 }; int n = a.length; System.out.println(Sum_Modulo(a, n)); } } // This code is contributed // by PrinciRaj1992 |
Python3
# Python3 implementation of the approach mod = 10 * * 9 + 7 # Function to return the sum of # (a[i] % a[j]) for all valid pairs def Sum_Modulo(a, n): Max = max (a) # To store the frequency of each element cnt = [ 0 for i in range ( Max + 1 )] # Store the frequency of each element for i in a: cnt[i] + = 1 # To store the required answer ans = 0 # For all valid pairs for i in range ( 1 , Max + 1 ): for j in range ( 1 , Max + 1 ): # Update the count ans = ans + cnt[i] * \ cnt[j] * (i % j) ans = ans % mod return ans # Driver code a = [ 1 , 2 , 3 ] n = len (a) print (Sum_Modulo(a, n)) # This code is contributed by Mohit Kumar |
C#
// C# implementation of the approach using System; using System.Linq; class GFG { static int mod = ( int )(1e9 + 7); // Function to return the sum of (a[i] % a[j]) // for all valid pairs static int Sum_Modulo( int []a, int n) { int max = a.Max(); // To store the frequency of each element int []cnt = new int [max + 1]; // Store the frequency of each element for ( int i = 0; i < n; i++) cnt[a[i]]++; // To store the required answer long ans = 0; // For all valid pairs for ( int i = 1; i <= max; i++) { for ( int j = 1; j <= max; j++) { // Update the count ans = ans + cnt[i] * cnt[j] * (i % j); ans = ans % mod; } } return ( int )(ans); } // Driver code public static void Main(String[] args) { int []a = { 1, 2, 3 }; int n = a.Length; Console.WriteLine(Sum_Modulo(a, n)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript implementation of the approach let mod = 1e9 + 7 // Function to return the sum of (a[i] % a[j]) // for all valid pairs function Sum_Modulo(a, n) { let max = a.sort((a, b) => b - a)[0]; // To store the frequency of each element let cnt = new Array(max + 1).fill(0); // Store the frequency of each element for (let i = 0; i < n; i++) cnt[a[i]]++; // To store the required answer let ans = 0; // For all valid pairs for (let i = 1; i <= max; i++) { for (let j = 1; j <= max; j++) { // Update the count ans = ans + cnt[i] * cnt[j] * (i % j); ans = ans % mod; } } return (ans); } // Driver code let a = [1, 2, 3]; let n = a.length; document.write(Sum_Modulo(a, n)); // This code is contributed by _saurabh_jaiswal </script> |
5
Time Complexity: O(MAX2)
Auxiliary Space: O(MAX)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!