Given an array arr[], the task is to find the maximum number of indices j < i such that (arr[j] % arr[i]) = 0 among all the array elements.
Example:
Input: arr[] = {8, 1, 28, 4, 2, 6, 7}
Output: 3
No of multiples for each element before itself –
N(8) = 0 ()
N(1) = 1 (8)
N(28) = 0 ()
N(4) = 2 (28, 8)
N(2) = 3 (4, 28, 8)
N(6) = 0 ()
N(7) = 1 (28)
Maximum out of these multiples is – 3Input: arr[] = {8, 12, 56, 32, 10, 3, 2, 4}
Output: 5
Approach:
- Use a map to store all the divisors of each array element.
- Generate all the divisors of an element in sqrt(n) time using the approach discussed in this article.
- Now, take the maximum of all the stored divisors for each element and update it.
Below is the implementation of the above approach:
C++14
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; const int MAX = 100000; // Map to store the divisor count int divisors[MAX]; // Function to generate the divisors // of all the array elements int generateDivisors( int n) { for ( int i = 1; i <= sqrt (n); i++) { if (n % i == 0) { if (n / i == i) { divisors[i]++; } else { divisors[i]++; divisors[n / i]++; } } } } // Function to find the maximum number // of multiples in an array before it int findMaxMultiples( int * arr, int n) { // To store the maximum divisor count int ans = 0; for ( int i = 0; i < n; i++) { // Update ans if more number // of divisors are found ans = max(divisors[arr[i]], ans); // Generating all the divisors of // the next element of the array generateDivisors(arr[i]); } return ans; } // Driver code int main() { int arr[] = { 8, 1, 28, 4, 2, 6, 7 }; int n = sizeof (arr) / sizeof ( int ); cout << findMaxMultiples(arr, n); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { static int MAX = 100000 ; // Map to store the divisor count static int []divisors = new int [MAX]; // Function to generate the divisors // of all the array elements static void generateDivisors( int n) { for ( int i = 1 ; i <= Math.sqrt(n); i++) { if (n % i == 0 ) { if (n / i == i) { divisors[i]++; } else { divisors[i]++; divisors[n / i]++; } } } } // Function to find the maximum number // of multiples in an array before it static int findMaxMultiples( int []arr, int n) { // To store the maximum divisor count int ans = 0 ; for ( int i = 0 ; i < n; i++) { // Update ans if more number // of divisors are found ans = Math.max(divisors[arr[i]], ans); // Generating all the divisors of // the next element of the array generateDivisors(arr[i]); } return ans; } // Driver code public static void main(String[] args) { int arr[] = { 8 , 1 , 28 , 4 , 2 , 6 , 7 }; int n = arr.length; System.out.print(findMaxMultiples(arr, n)); } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 implementation of the approach from math import ceil,sqrt MAX = 100000 # Map to store the divisor count divisors = [ 0 ] * MAX # Function to generate the divisors # of all the array elements def generateDivisors(n): for i in range ( 1 ,ceil(sqrt(n)) + 1 ): if (n % i = = 0 ): if (n / / i = = i): divisors[i] + = 1 else : divisors[i] + = 1 divisors[n / / i] + = 1 # Function to find the maximum number # of multiples in an array before it def findMaxMultiples(arr, n): # To store the maximum divisor count ans = 0 for i in range (n): # Update ans if more number # of divisors are found ans = max (divisors[arr[i]], ans) # Generating all the divisors of # the next element of the array generateDivisors(arr[i]) return ans # Driver code arr = [ 8 , 1 , 28 , 4 , 2 , 6 , 7 ] n = len (arr) print (findMaxMultiples(arr, n)) # This code is contributed by mohit kumar 29 |
C#
// C# implementation of the approach using System; class GFG { static int MAX = 100000; // Map to store the divisor count static int []divisors = new int [MAX]; // Function to generate the divisors // of all the array elements static void generateDivisors( int n) { for ( int i = 1; i <= Math.Sqrt(n); i++) { if (n % i == 0) { if (n / i == i) { divisors[i]++; } else { divisors[i]++; divisors[n / i]++; } } } } // Function to find the maximum number // of multiples in an array before it static int findMaxMultiples( int []arr, int n) { // To store the maximum divisor count int ans = 0; for ( int i = 0; i < n; i++) { // Update ans if more number // of divisors are found ans = Math.Max(divisors[arr[i]], ans); // Generating all the divisors of // the next element of the array generateDivisors(arr[i]); } return ans; } // Driver code public static void Main(String[] args) { int []arr = { 8, 1, 28, 4, 2, 6, 7 }; int n = arr.Length; Console.Write(findMaxMultiples(arr, n)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript implementation of the approach const MAX = 100000; // Map to store the divisor count var divisors = new Array(MAX).fill(0); // Function to generate the divisors // of all the array elements function generateDivisors(n) { for ( var i = 1; i <= Math.sqrt(n); i++) { if (n % i == 0) { if (n / i == i) { divisors[i]++; } else { divisors[i]++; divisors[n / i]++; } } } } // Function to find the maximum number // of multiples in an array before it function findMaxMultiples(arr, n) { // To store the maximum divisor count var ans = 0; for ( var i = 0; i < n; i++) { // Update ans if more number // of divisors are found ans = Math.max(divisors[arr[i]], ans); // Generating all the divisors of // the next element of the array generateDivisors(arr[i]); } return ans; } // Driver code var arr = [ 8, 1, 28, 4, 2, 6, 7 ]; var n = arr.length; document.write(findMaxMultiples(arr, n)); // This code is contributed by rdtank </script> |
3
Time Complexity: O(N*sqrt(val)), where N is the length of the array and val is the maximum value of the array elements.
Auxiliary Space: O(100000), as we are using extra space.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!