# Count of triplets in a given Array having GCD K

• Difficulty Level : Expert
• Last Updated : 01 Nov, 2021

Given an integer array arr[] and an integer K, the task is to count all triplets whose GCD is equal to K.
Examples:

Input: arr[] = {1, 4, 8, 14, 20}, K = 2
Output:
Explanation:
Triplets (4, 14, 20), (8, 14, 20) and (4, 8, 14) have GCD equal to 2.
Input: arr[] = {1, 2, 3, 4, 5}, K = 7
Output:

Approach:
Follow the steps below to solve the problem:

1. Maintain an array cnt[i] which denotes the numbers of triplet in array with GCD = i.
2. Now, to find cnt[i], first of all count all the multiples of i in the array which is stored in another array mul[i].
3. Now select any three values from mul[i]. Number of ways of selecting three values is mul [i] C 3, store this value in cnt[i].
4. But it also includes the triplets with GCD a multiple of i.So we Again iterate over all the multiples of i and subtract cnt[j] from cnt[i] where j is a multiple of i.
5. Finally return cnt[K].

Below is the implementation of the above approach:

## C++

 `// C++ program to count the``// number of triplets in the``// array with GCD equal to K``#include ``using` `namespace` `std;` `const` `int` `MAXN = 1e6 + 1;` `// frequency array``int` `freq[MAXN] = { 0 };` `// mul[i] stores the count``// of multiples of i``int` `mul[MAXN] = { 0 };` `// cnt[i] stores the count``// of triplets with gcd = i``int` `cnt[MAXN] = { 0 };` `// Return nC3``int` `nC3(``int` `n)``{``    ``if` `(n < 3)``        ``return` `0;``    ``return` `(n * (n - 1) * (n - 2)) / 6;``}` `// Function to count and return``// the number of triplets in the``// array with GCD equal to K``void` `count_triplet(vector<``int``> arr,``                   ``int` `N, ``int` `K)``{``    ``for` `(``int` `i = 0; i < N; i++) {` `        ``// Store frequency of``        ``// array elements``        ``freq[arr[i]]++;``    ``}``    ``for` `(``int` `i = 1; i <= 1000000; i++) {``        ``for` `(``int` `j = i; j <= 1000000;``             ``j += i) {``            ``// Store the multiples of``            ``// i present in the array``            ``mul[i] += freq[j];``        ``}``        ``// Count triplets with gcd``        ``// equal to any multiple of i``        ``cnt[i] = nC3(mul[i]);``    ``}` `    ``// Remove all triplets which have gcd``    ``// equal to a multiple of i``    ``for` `(``int` `i = 1000000; i >= 1; i--) {``        ``for` `(``int` `j = 2 * i; j <= 1000000;``             ``j += i) {``            ``cnt[i] -= cnt[j];``        ``}``    ``}``    ``cout << ``"Number of triplets "``         ``<< ``"with GCD "` `<< K;``    ``cout << ``" are "` `<< cnt[K];``}``// Driver Program``int` `main()``{``    ``vector<``int``> arr = { 1, 7, 12, 6,``                        ``15, 9 };``    ``int` `N = 6, K = 3;``    ``count_triplet(arr, N, K);``    ``return` `0;``}`

## Java

 `// Java program to count the``// number of triplets in the``// array with GCD equal to K``class` `GFG{``    ` `static` `int` `MAXN = ``1000001``;` `// Frequency array``static` `int` `freq[] = ``new` `int``[MAXN];` `// mul[i] stores the count``// of multiples of i``static` `int` `mul[] = ``new` `int``[MAXN];` `// cnt[i] stores the count``// of triplets with gcd = i``static` `int` `cnt[] = ``new` `int``[MAXN];` `// Return nC3``static` `int` `nC3(``int` `n)``{``    ``if` `(n < ``3``)``        ``return` `0``;``        ` `    ``return` `(n * (n - ``1``) * (n - ``2``)) / ``6``;``}` `// Function to count and return``// the number of triplets in the``// array with GCD equal to K``static` `void` `count_triplet(``int``[] arr,``                          ``int` `N, ``int` `K)``{``    ``int` `i, j;``    ``for``(i = ``0``; i < N; i++)``    ``{``       ` `       ``// Store frequency of``       ``// array elements``       ``freq[arr[i]]++;``    ``}``    ` `    ``for``(i = ``1``; i <= ``1000000``; i++)``    ``{``       ``for``(j = i; j <= ``1000000``; j += i)``       ``{``           ` `          ``// Store the multiples of``          ``// i present in the array``          ``mul[i] += freq[j];``       ``}``       ` `       ``// Count triplets with gcd``       ``// equal to any multiple of i``       ``cnt[i] = nC3(mul[i]);``    ``}` `    ``// Remove all triplets which have gcd``    ``// equal to a multiple of i``    ``for``(i = ``1000000``; i >= ``1``; i--)``    ``{``       ``for``(j = ``2` `* i; j <= ``1000000``; j += i)``       ``{``          ``cnt[i] -= cnt[j];``       ``}``    ``}``    ``System.out.print(``"Number of triplets "` `+``                     ``"with GCD "` `+ K);``    ``System.out.print(``" are "` `+ cnt[K]);``}` `// Driver code``public` `static` `void` `main (String []args)``{``    ``int` `[]arr = { ``1``, ``7``, ``12``, ``6``, ``15``, ``9` `};``    ``int` `N = ``6``, K = ``3``;``    ` `    ``count_triplet(arr, N, K);``}``}` `// This code is contributed by chitranayal`

## Python3

 `# Python3 program to count the number of``# triplets in the array with GCD equal to K``MAXN ``=` `int``(``1e6` `+` `1``)` `# Frequency array``freq ``=` `[``0``] ``*` `MAXN` `# mul[i] stores the count``# of multiples of i``mul ``=` `[``0``] ``*` `MAXN` `# cnt[i] stores the count``# of triplets with gcd = i``cnt ``=` `[``0``] ``*` `MAXN` `# Return nC3``def` `nC3(n):` `    ``if``(n < ``3``):``        ``return` `0``    ``return` `(n ``*` `(n ``-` `1``) ``*` `(n ``-` `2``)) ``/` `6` `# Function to count and return``# the number of triplets in the``# array with GCD equal to K``def` `count_triplet(arr, N, K):` `    ``for` `i ``in` `range``(N):` `        ``# Store frequency of``        ``# array elements``        ``freq[arr[i]] ``+``=` `1` `    ``for` `i ``in` `range``(``1``, ``1000000` `+` `1``):``        ``for` `j ``in` `range``(i, ``1000000` `+` `1``, i):` `            ``# Store the multiples of``            ``# i present in the array``            ``mul[i] ``+``=` `freq[j]` `        ``# Count triplets with gcd``        ``# equal to any multiple of i``        ``cnt[i] ``=` `nC3(mul[i])` `    ``# Remove all triplets which have gcd``    ``# equal to a multiple of i``    ``for` `i ``in` `range``(``1000000``, ``0``, ``-``1``):``        ``for` `j ``in` `range``(``2` `*` `i, ``1000000` `+` `1``, i):``            ``cnt[i] ``-``=` `cnt[j]` `    ``print``(``"Number of triplets with GCD"``          ``" {0} are {1}"``.``format``(K, ``int``(cnt[K])))` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:` `    ``arr ``=` `[ ``1``, ``7``, ``12``, ``6``, ``15``, ``9` `]``    ``N ``=` `6``    ``K ``=` `3` `    ``count_triplet(arr, N, K)` `# This code is contributed by Shivam Singh`

## C#

 `// C# program to count the``// number of triplets in the``// array with GCD equal to K``using` `System;``class` `GFG{``     ` `static` `int` `MAXN = 1000001;`` ` `// Frequency array``static` `int` `[]freq = ``new` `int``[MAXN];`` ` `// mul[i] stores the count``// of multiples of i``static` `int` `[]mul = ``new` `int``[MAXN];`` ` `// cnt[i] stores the count``// of triplets with gcd = i``static` `int` `[]cnt = ``new` `int``[MAXN];`` ` `// Return nC3``static` `int` `nC3(``int` `n)``{``    ``if` `(n < 3)``        ``return` `0;``         ` `    ``return` `(n * (n - 1) * (n - 2)) / 6;``}`` ` `// Function to count and return``// the number of triplets in the``// array with GCD equal to K``static` `void` `count_triplet(``int``[] arr,``                          ``int` `N, ``int` `K)``{``    ``int` `i, j;``    ``for``(i = 0; i < N; i++)``    ``{``        ` `       ``// Store frequency of``       ``// array elements``       ``freq[arr[i]]++;``    ``}``     ` `    ``for``(i = 1; i <= 1000000; i++)``    ``{``       ``for``(j = i; j <= 1000000; j += i)``       ``{``            ` `          ``// Store the multiples of``          ``// i present in the array``          ``mul[i] += freq[j];``       ``}``        ` `       ``// Count triplets with gcd``       ``// equal to any multiple of i``       ``cnt[i] = nC3(mul[i]);``    ``}`` ` `    ``// Remove all triplets which have gcd``    ``// equal to a multiple of i``    ``for``(i = 1000000; i >= 1; i--)``    ``{``       ``for``(j = 2 * i; j <= 1000000; j += i)``       ``{``          ``cnt[i] -= cnt[j];``       ``}``    ``}``    ``Console.Write(``"Number of triplets "` `+``                        ``"with GCD "` `+ K);``    ``Console.Write(``" are "` `+ cnt[K]);``}`` ` `// Driver code``public` `static` `void` `Main (``string` `[]args)``{``    ``int` `[]arr = { 1, 7, 12, 6, 15, 9 };``    ``int` `N = 6, K = 3;``     ` `    ``count_triplet(arr, N, K);``}``}`` ` `// This code is contributed by Ritik Bansal`

## Javascript

 ``

Output:

`Number of triplets with GCD 3 are 4`

Time Complexity: O (N * log N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up