Given A and B, the task is to find the number of possible values that X can take such that the given modular equation (A mod X) = B holds good. Here, X is also called a solution of the modular equation.
Examples:
Input : A = 26, B = 2
Output : 6
Explanation:
X can be equal to any of {3, 4, 6, 8, 12, 24} as A modulus any of these values equals 2
i. e., (26 mod 3) = (26 mod 4)
= (26 mod 6) = (26 mod 8)
= …. = 2
Input : 21 5
Output : 2
Explanation
X can be equal to any of {8, 16} as A modulus any of these values equals 5
i.e. (21 mod 8) = (21 mod 16) = 5
If we carefully analyze the equation A mod X = B its easy to note that if (A = B) then there are infinitely many values greater than A that X can take. In the Case when (A < B), there cannot be any possible value of X for which the modular equation holds. So the only case we are left to investigate is when (A > B).So now we focus on this case in depth.
Now, in this case we can use a well known relation i.e.
Dividend = Divisor * Quotient + Remainder
We are looking for all possible X i.e. Divisors given A i.e Dividend and B i.e., remainder. So,
We can say,
A = X * Quotient + B
Let Quotient be represented as Y
? A = X * Y + B
A - B = X * Y
? To get integral values of Y,
we need to take all X such that X divides (A - B)
? X is a divisor of (A - B)
So, the problem reduces to finding the divisors of (A – B) and the number of such divisors is the possible values X can take.
But as we know A mod X would result in values from (0 to X – 1) we must take all such X such that X > B.
Thus, we can conclude by saying that the number of divisors of (A – B) greater than B, are the all possible values X can take to satisfy A mod X = B
C++
#include <bits/stdc++.h>
using namespace std;
int calculateDivisors( int A, int B)
{
int N = (A - B);
int noOfDivisors = 0;
for ( int i = 1; i <= sqrt (N); i++) {
if ((N % i) == 0) {
if (i > B)
noOfDivisors++;
if ((N / i) != i && (N / i) > B)
noOfDivisors++;
}
}
return noOfDivisors;
}
int numberOfPossibleWaysUtil( int A, int B)
{
if (A == B)
return -1;
if (A < B)
return 0;
int noOfDivisors = 0;
noOfDivisors = calculateDivisors(A, B);
return noOfDivisors;
}
void numberOfPossibleWays( int A, int B)
{
int noOfSolutions = numberOfPossibleWaysUtil(A, B);
if (noOfSolutions == -1) {
cout << "For A = " << A << " and B = " << B
<< ", X can take Infinitely many values"
" greater than " << A << "\n" ;
}
else {
cout << "For A = " << A << " and B = " << B
<< ", X can take " << noOfSolutions
<< " values\n" ;
}
}
int main()
{
int A = 26, B = 2;
numberOfPossibleWays(A, B);
A = 21, B = 5;
numberOfPossibleWays(A, B);
return 0;
}
|
Java
import java.lang.*;
class GFG
{
public static int calculateDivisors( int A, int B)
{
int N = (A - B);
int noOfDivisors = 0 ;
for ( int i = 1 ; i <= Math.sqrt(N); i++)
{
if ((N % i) == 0 )
{
if (i > B)
noOfDivisors++;
if ((N / i) != i && (N / i) > B)
noOfDivisors++;
}
}
return noOfDivisors;
}
public static int numberOfPossibleWaysUtil( int A, int B)
{
if (A == B)
return - 1 ;
if (A < B)
return 0 ;
int noOfDivisors = 0 ;
noOfDivisors = calculateDivisors(A, B);
return noOfDivisors;
}
public static void numberOfPossibleWays( int A, int B)
{
int noOfSolutions = numberOfPossibleWaysUtil(A, B);
if (noOfSolutions == - 1 )
{
System.out.print( "For A = " + A + " and B = " + B
+ ", X can take Infinitely many values"
+ " greater than " + A + "\n" );
}
else
{
System.out.print( "For A = " + A + " and B = " + B
+ ", X can take " + noOfSolutions
+ " values\n" );
}
}
public static void main(String[] args)
{
int A = 26 , B = 2 ;
numberOfPossibleWays(A, B);
A = 21 ;
B = 5 ;
numberOfPossibleWays(A, B);
}
}
|
Python3
import math
def calculateDivisors (A, B):
N = A - B
noOfDivisors = 0
a = math.sqrt(N)
for i in range ( 1 , int (a + 1 )):
if ((N % i = = 0 )):
if (i > B):
noOfDivisors + = 1
if ((N / i) ! = i and (N / i) > B):
noOfDivisors + = 1 ;
return noOfDivisors
def numberOfPossibleWaysUtil (A, B):
if (A = = B):
return - 1
if (A < B):
return 0
noOfDivisors = 0
noOfDivisors = calculateDivisors;
return noOfDivisors
def numberOfPossibleWays(A, B):
noOfSolutions = numberOfPossibleWaysUtil(A, B)
if (noOfSolutions = = - 1 ):
print ( "For A = " , A , " and B = " , B
, ", X can take Infinitely many values"
, " greater than " , A)
else :
print ( "For A = " , A , " and B = " , B
, ", X can take " , noOfSolutions
, " values" )
A = 26
B = 2
numberOfPossibleWays(A, B)
A = 21
B = 5
numberOfPossibleWays(A, B)
|
C#
using System;
class GFG
{
static int calculateDivisors( int A, int B)
{
int N = (A - B);
int noOfDivisors = 0;
double a = Math.Sqrt(N);
for ( int i = 1; i <= ( int )(a); i++)
{
if ((N % i) == 0)
{
if (i > B)
noOfDivisors++;
if ((N / i) != i && (N / i) > B)
noOfDivisors++;
}
}
return noOfDivisors;
}
static int numberOfPossibleWaysUtil( int A, int B)
{
if (A == B)
return -1;
if (A < B)
return 0;
int noOfDivisors = 0;
noOfDivisors = calculateDivisors(A, B);
return noOfDivisors;
}
public static void numberOfPossibleWays( int A, int B)
{
int noOfSolutions = numberOfPossibleWaysUtil(A, B);
if (noOfSolutions == -1)
{
Console.Write ( "For A = " + A + " and B = " + B
+ ", X can take Infinitely many values"
+ " greater than " + A + "\n" );
}
else
{
Console.Write ( "For A = " + A + " and B = " + B
+ ", X can take " + noOfSolutions
+ " values\n" );
}
}
public static void Main()
{
int A = 26, B = 2;
numberOfPossibleWays(A, B);
A = 21;
B = 5;
numberOfPossibleWays(A, B);
}
}
|
PHP
<?php
function calculateDivisors( $A , $B )
{
$N = ( $A - $B );
$noOfDivisors = 0;
for ( $i = 1; $i <= sqrt( $N ); $i ++) {
if (( $N % $i ) == 0) {
if ( $i > $B )
$noOfDivisors ++;
if (( $N / $i ) != $i && ( $N / $i ) > $B )
$noOfDivisors ++;
}
}
return $noOfDivisors ;
}
function numberOfPossibleWaysUtil( $A , $B )
{
if ( $A == $B )
return -1;
if ( $A < $B )
return 0;
$noOfDivisors = 0;
$noOfDivisors = calculateDivisors( $A , $B );
return $noOfDivisors ;
}
function numberOfPossibleWays( $A , $B )
{
$noOfSolutions = numberOfPossibleWaysUtil( $A , $B );
if ( $noOfSolutions == -1) {
echo "For A = " , $A , " and B = " , $B ,
"X can take Infinitely many values
greater than " , $A , " \n";
}
else {
echo "For A = " , $A , " and B = " , $B ,
" X can take " , $noOfSolutions ,
" values\n" ;
}
}
$A = 26; $B = 2;
numberOfPossibleWays( $A , $B );
$A = 21; $B = 5;
numberOfPossibleWays( $A , $B );
?>
|
Javascript
<script>
function calculateDivisors(A, B)
{
let N = (A - B);
let noOfDivisors = 0;
for (let i = 1; i <= Math.sqrt(N); i++)
{
if ((N % i) == 0)
{
if (i > B)
noOfDivisors++;
if ((N / i) != i && (N / i) > B)
noOfDivisors++;
}
}
return noOfDivisors;
}
function numberOfPossibleWaysUtil(A, B)
{
if (A == B)
return -1;
if (A < B)
return 0;
let noOfDivisors = 0;
noOfDivisors = calculateDivisors(A, B);
return noOfDivisors;
}
function numberOfPossibleWays(A, B)
{
let noOfSolutions = numberOfPossibleWaysUtil(A, B);
if (noOfSolutions == -1)
{
document.write( "For A = " + A + " and B = " +
B + ", X can take Infinitely " +
"many values" + " greater than " +
A + "<br/>" );
}
else
{
document.write( "For A = " + A + " and B = " +
B + ", X can take " +
noOfSolutions + " values " +
"<br/>" );
}
}
let A = 26, B = 2;
numberOfPossibleWays(A, B);
A = 21, B = 5;
numberOfPossibleWays(A, B);
</script>
|
The Time Complexity of the above approach is nothing but the time complexity of finding the number of divisors of (A – B) ie O(?(A – B))
Auxiliary Space: O(1)