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 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
// 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
# 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#
// 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 |
Javascript
<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
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!

… [Trackback]
[…] Information to that Topic: geeksforgeeks.org/maximum-number-of-multiples-in-an-array-before-any-element/ […]