Maximum number of multiples in an array before any element - GeeksforGeeks

04 May, 2021
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 – 3
Input: 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.
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
Java
Python3
C#
Javascript
// C++ implementation of the approach #include <bits/stdc++.h>using namespace std; const int MAX = 100000; // Map to store the divisor countint divisors[MAX]; // Function to generate the divisors// of all the array elementsint 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 itint 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 codeint main(){    int arr[] = { 8, 1, 28, 4, 2, 6, 7 };    int n = sizeof(arr) / sizeof(int);     cout << findMaxMultiples(arr, n);     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{ static int MAX = 100000; // Map to store the divisor countstatic int []divisors = new int[MAX]; // Function to generate the divisors// of all the array elementsstatic 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 itstatic 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 codepublic 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 implementation of the approachfrom math import ceil,sqrtMAX = 100000 # Map to store the divisor countdivisors = [0] * MAX # Function to generate the divisors# of all the array elementsdef 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 itdef 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 codearr = [8, 1, 28, 4, 2, 6, 7]n = len(arr) print(findMaxMultiples(arr, n)) # This code is contributed by mohit kumar 29
// C# implementation of the approachusing System; class GFG{ static int MAX = 100000; // Map to store the divisor countstatic int []divisors = new int[MAX]; // Function to generate the divisors// of all the array elementsstatic 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 itstatic 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 codepublic 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
<script> // JavaScript implementation of the approachconst MAX = 100000; // Map to store the divisor countvar divisors = new Array(MAX).fill(0); // Function to generate the divisors// of all the array elementsfunction 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 itfunction 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 codevar 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
 
mohit kumar 29
princiraj1992
29AjayKumar
rdtank
Arrays
Dynamic Programming
Technical Scripter
Arrays
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
0-1 Knapsack Problem | DP-10
Program for Fibonacci numbers
Longest Common Subsequence | DP-4
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16