Count of quadruplets from range [L, R] having GCD equal to K
Given an integer K and a range [L, R], the task is to count the quadruplet pairs from the given range having gcd equal to K.
Examples:
Input: L = 1, R = 5, K = 3
Output: 1
(3, 3, 3, 3) is the only valid quadruplet with gcd = 3
Input: L = 2, R = 24, K = 5
Output: 239
Naive approach: We can iterate over all the numbers with four loops and for every quadruplet pair check whether its gcd is equal to K.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countQuadruplets( int l, int r, int k)
{
int count = 0;
for ( int u = l; u <= r; u++) {
for ( int v = l; v <= r; v++) {
for ( int w = l; w <= r; w++) {
for ( int x = l; x <= r; x++) {
if (__gcd(__gcd(u, v), __gcd(w, x)) == k)
count++;
}
}
}
}
return count;
}
int main()
{
int l = 1, r = 10, k = 2;
cout << countQuadruplets(l, r, k);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int gcd( int a, int b)
{
if (b == 0 )
return a;
return gcd(b, a % b);
}
static int countQuadruplets( int l, int r, int k)
{
int count = 0 ;
for ( int u = l; u <= r; u++) {
for ( int v = l; v <= r; v++) {
for ( int w = l; w <= r; w++) {
for ( int x = l; x <= r; x++) {
if (gcd(gcd(u, v), gcd(w, x)) == k)
count++;
}
}
}
}
return count;
}
public static void main(String[] args)
{
int l = 1 , r = 10 , k = 2 ;
System.out.println(countQuadruplets(l, r, k));
}
}
|
Python 3
from math import gcd
def countQuadruplets(l, r, k):
count = 0
for u in range (l, r + 1 , 1 ):
for v in range (l, r + 1 , 1 ):
for w in range (l, r + 1 , 1 ):
for x in range (l, r + 1 , 1 ):
if (gcd(gcd(u, v), gcd(w, x)) = = k):
count + = 1
return count
if __name__ = = '__main__' :
l = 1
r = 10
k = 2
print (countQuadruplets(l, r, k))
|
C#
using System;
class GFG {
static int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
static int countQuadruplets( int l, int r, int k)
{
int count = 0;
for ( int u = l; u <= r; u++) {
for ( int v = l; v <= r; v++) {
for ( int w = l; w <= r; w++) {
for ( int x = l; x <= r; x++) {
if (gcd(gcd(u, v), gcd(w, x)) == k)
count++;
}
}
}
}
return count;
}
static public void Main()
{
int l = 1, r = 10, k = 2;
Console.WriteLine(countQuadruplets(l, r, k));
}
}
|
Javascript
<script>
function gcd(a , b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
function countQuadruplets(l , r , k) {
var count = 0;
for (u = l; u <= r; u++) {
for (v = l; v <= r; v++) {
for (w = l; w <= r; w++) {
for (x = l; x <= r; x++) {
if (gcd(gcd(u, v), gcd(w, x)) == k)
count++;
}
}
}
}
return count;
}
var l = 1, r = 10, k = 2;
document.write(countQuadruplets(l, r, k));
</script>
|
Time Complexity: O((r – l)4)
Auxiliary Space: O(1)
Efficient approach:
- Find the GCD of every possible pair (x, y) in the given range.
- Count the frequencies of every possible GCD value.
- After that if the GCD value of two numbers is k then increment count by frequency[i] * frequency[j].
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
int countQuadruplets( int l, int r, int k)
{
int frequency[r + 1] = { 0 };
for ( int i = l; i <= r; i++) {
for ( int j = l; j <= r; j++) {
frequency[gcd(i, j)]++;
}
}
long long answer = 0;
for ( int i = 1; i <= r; i++) {
for ( int j = 1; j <= r; j++) {
if (gcd(i, j) == k) {
answer += (frequency[i] * frequency[j]);
}
}
}
return answer;
}
int main()
{
int l = 1, r = 10, k = 2;
cout << countQuadruplets(l, r, k);
return 0;
}
|
Java
class GFG
{
static int gcd( int a, int b)
{
if (b == 0 )
return a;
return gcd(b, a % b);
}
static int countQuadruplets( int l, int r, int k)
{
int frequency[]= new int [r + 1 ] ;
for ( int i = l; i <= r; i++)
{
for ( int j = l; j <= r; j++)
{
frequency[gcd(i, j)]++;
}
}
long answer = 0 ;
for ( int i = 1 ; i <= r; i++)
{
for ( int j = 1 ; j <= r; j++)
{
if (gcd(i, j) == k)
{
answer += (frequency[i] * frequency[j]);
}
}
}
return ( int )answer;
}
public static void main(String args[])
{
int l = 1 , r = 10 , k = 2 ;
System.out.println(countQuadruplets(l, r, k));
}
}
|
Python3
def gcd(a, b):
if (b = = 0 ):
return a;
return gcd(b, a % b);
def countQuadruplets(l, r, k):
frequency = [ 0 ] * (r + 1 );
for i in range (l, r + 1 ):
for j in range (l, r + 1 ):
frequency[gcd(i, j)] + = 1 ;
answer = 0 ;
for i in range (l, r + 1 ):
for j in range (l, r + 1 ):
if (gcd(i, j) = = k):
answer + = (frequency[i] * frequency[j]);
return answer;
if __name__ = = '__main__' :
l, r, k = 1 , 10 , 2 ;
print (countQuadruplets(l, r, k));
|
C#
using System;
class GFG
{
static int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
static int countQuadruplets( int l, int r, int k)
{
int []frequency= new int [r + 1] ;
for ( int i = l; i <= r; i++)
{
for ( int j = l; j <= r; j++)
{
frequency[gcd(i, j)]++;
}
}
long answer = 0;
for ( int i = 1; i <= r; i++)
{
for ( int j = 1; j <= r; j++)
{
if (gcd(i, j) == k)
{
answer += (frequency[i] * frequency[j]);
}
}
}
return ( int )answer;
}
static public void Main ()
{
int l = 1, r = 10, k = 2;
Console.WriteLine(countQuadruplets(l, r, k));
}
}
|
Javascript
<script>
function gcd(a, b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
function countQuadruplets(l, r, k)
{
let frequency= new Array(r + 1);
frequency.fill(0);
for (let i = l; i <= r; i++)
{
for (let j = l; j <= r; j++)
{
frequency[gcd(i, j)]++;
}
}
let answer = 0;
for (let i = 1; i <= r; i++)
{
for (let j = 1; j <= r; j++)
{
if (gcd(i, j) == k)
{
answer += (frequency[i] * frequency[j]);
}
}
}
return answer;
}
let l = 1, r = 10, k = 2;
document.write(countQuadruplets(l, r, k));
</script>
|
Time Complexity: O(r2)
Auxiliary Space: O(r)
Last Updated :
30 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...