Given four integers m, n, a, b. Find how many integers from range m to n are divisible by a or b.
Examples :
Input: 3 11 2 3 Output: 6 Explanation: m = 3, n = 11, a = 2, b = 3 There are total 6 numbers from 3 to 11 which are divisible by 2 or 3 i.e, 3, 4, 6, 8, 9, 10 Input: arr[] = {11, 1000000, 6, 35} Output: 190475
A Naive approach is to run a loop from m to n and count all numbers which are divisible by either a or b. Time complexity of this approach will be O(m – n) which will definitely time out for large values of m.
An efficient approach is to use simple LCM and division method.
- Divide n by a to obtain total count of all numbers(1 to n) divisible by ‘a’.
- Divide m-1 by a to obtain total count of all numbers(1 to m-1) divisible by ‘a’.
- Subtract the count of step 1 and 2 to obtain total divisors in range m to n.
Now we have a total number of divisors of ‘a’ in given range. Repeat the above to count total divisors of ‘b’.
Add these to obtain total count of divisors ‘a’ and ‘b’.
But the number divisible by both a and b counted twice. Therefore to remove this ambiguity we can use LCM of a and b to count total number divisible by both ‘a’ and ‘b’.
- Find LCM of ‘a’ and ‘b’.
- Divide n by LCM to obtain the count of numbers(1 to n) divisible by both ‘a’ and ‘b’.
- Divide m-1 by LCM to obtain the count of numbers(1 to m-1) divisible by both ‘a’ and ‘b’.
- Subtract the count of step 2 and 3 to obtain total divisors of both ‘a’ and ‘b’.
Now subtract this result from the previous calculated result to find total count of all unique divisors of ‘a’ or ‘b’.
C++
// C++ program to count total divisors of 'a' // or 'b' in a given range #include <bits/stdc++.h> using namespace std; // Utility function to find LCM of two numbers int FindLCM( int a, int b) { return (a * b) / __gcd(a, b); } // Function to calculate all divisors in given range int rangeDivisor( int m, int n, int a, int b) { // Find LCM of a and b int lcm = FindLCM(a, b); int a_divisor = n / a - (m - 1) / a; int b_divisor = n / b - (m - 1) / b; // Find common divisor by using LCM int common_divisor = n / lcm - (m - 1) / lcm; int ans = a_divisor + b_divisor - common_divisor; return ans; } // Driver code int main() { int m = 3, n = 11, a = 2, b = 3; cout << rangeDivisor(m, n, a, b) << endl; m = 11, n = 1000000, a = 6, b = 35; cout << rangeDivisor(m, n, a, b); return 0; } |
Java
// Java program to count total divisors of 'a' // or 'b' in a given range import java.math.BigInteger; class Test { // Utility method to find LCM of two numbers static int FindLCM( int a, int b) { return (a * b) / new BigInteger(a+ "" ).gcd( new BigInteger(b+ "" )).intValue(); } // method to calculate all divisors in given range static int rangeDivisor( int m, int n, int a, int b) { // Find LCM of a and b int lcm = FindLCM(a, b); int a_divisor = n / a - (m - 1 ) / a; int b_divisor = n / b - (m - 1 ) / b; // Find common divisor by using LCM int common_divisor = n / lcm - (m - 1 ) / lcm; int ans = a_divisor + b_divisor - common_divisor; return ans; } // Driver method public static void main(String args[]) { int m = 3 , n = 11 , a = 2 , b = 3 ; System.out.println(rangeDivisor(m, n, a, b)); m = 11 ; n = 1000000 ; a = 6 ; b = 35 ; System.out.println(rangeDivisor(m, n, a, b)); } } |
Python3
# python program to count total divisors # of 'a' or 'b' in a given range def __gcd(x, y): if x > y: small = y else : small = x for i in range ( 1 , small + 1 ): if ((x % i = = 0 ) and (y % i = = 0 )): gcd = i return gcd # Utility function to find LCM of two # numbers def FindLCM(a, b): return (a * b) / __gcd(a, b); # Function to calculate all divisors in # given range def rangeDivisor(m, n, a, b): # Find LCM of a and b lcm = FindLCM(a, b) a_divisor = int ( n / a - (m - 1 ) / a) b_divisor = int (n / b - (m - 1 ) / b) # Find common divisor by using LCM common_divisor = int ( n / lcm - (m - 1 ) / lcm) ans = a_divisor + b_divisor - common_divisor return ans # Driver code m = 3 n = 11 a = 2 b = 3 ; print (rangeDivisor(m, n, a, b)) m = 11 n = 1000000 a = 6 b = 35 print (rangeDivisor(m, n, a, b)) # This code is contributed by Sam007 |
C#
// C# program to count total divisors // of 'a' or 'b' in a given range using System; class GFG { static int GCD( int num1, int num2) { int Remainder; while (num2 != 0) { Remainder = num1 % num2; num1 = num2; num2 = Remainder; } return num1; } // Utility function to find LCM of // two numbers static int FindLCM( int a, int b) { return (a * b) / GCD(a, b); } // Function to calculate all divisors in given range static int rangeDivisor( int m, int n, int a, int b) { // Find LCM of a and b int lcm = FindLCM(a, b); int a_divisor = n / a - (m - 1) / a; int b_divisor = n / b - (m - 1) / b; // Find common divisor by using LCM int common_divisor = n / lcm - (m - 1) / lcm; int ans = a_divisor + b_divisor - common_divisor; return ans; } public static void Main () { int m = 3, n = 11, a = 2, b = 3; Console.WriteLine(rangeDivisor(m, n, a, b)); m = 11; n = 1000000; a = 6; b = 35; Console.WriteLine(rangeDivisor(m, n, a, b)); } } // This code is contributed by Sam007. |
PHP
<?php // PHP program to count total // divisors of 'a' or 'b' in // a given range function gcd( $a , $b ) { return ( $a % $b ) ? gcd( $b , $a % $b ) : $b ; } // Utility function to // find LCM of two numbers function FindLCM( $a , $b ) { return ( $a * $b ) / gcd( $a , $b ); } // Function to calculate // all divisors in given range function rangeDivisor( $m , $n , $a , $b ) { // Find LCM of a and b $lcm = FindLCM( $a , $b ); $a_divisor = $n / $a - ( $m - 1) / $a ; $b_divisor = $n / $b - ( $m - 1) / $b ; // Find common divisor by using LCM $common_divisor = $n / $lcm - ( $m - 1) / $lcm ; $ans = $a_divisor + $b_divisor - $common_divisor ; return $ans ; } // Driver Code $m = 3; $n = 11; $a = 2; $b = 3; print ( ceil (rangeDivisor( $m , $n , $a , $b ))); echo "\n" ; $m = 11; $n = 1000000; $a = 6; $b = 35; print ( ceil (rangeDivisor( $m , $n , $a , $b ))); // This code is contributed by Sam007 ?> |
Output:
6 190475
Time complexity: O(log(MAX(a, b))
Auxiliary space: O(1)
This article is contributed by Shubham Bansal. 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.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Check if count of even divisors of N is equal to count of odd divisors
- Check if a number has an odd count of odd divisors and even count of even divisors
- Minimum value exceeding X whose count of divisors has different parity with count of divisors of X
- Find sum of inverse of the divisors when sum of divisors and the number is given
- Total number of divisors for a given number
- Find sum of divisors of all the divisors of a natural number
- Divisors of n-square that are not divisors of n
- Maximum possible prime divisors that can exist in numbers having exactly N divisors
- Count elements in the given range which have maximum number of divisors
- Program to find count of numbers having odd number of divisors in given range
- Total ways of choosing X men and Y women from a total of M men and W women
- Find and Count total factors of co-prime A or B in a given range 1 to N
- Numbers in range [L, R] such that the count of their divisors is both even and prime
- Sum of numbers in a range [L, R] whose count of divisors is prime
- Count of divisors of product of an Array in range L to R for Q queries
- Count of elements having odd number of divisors in index range [L, R] for Q queries
- Count total set bits in all numbers from range L to R
- Querying maximum number of divisors that a number in a given range has
- Find numbers with K odd divisors in a given range
- Find numbers with n-divisors in a given range