📌  相关文章
📜  具有GCD K的给定数组中的三元组计数

📅  最后修改于: 2021-05-17 03:47:45             🧑  作者: Mango

给定一个整数数组arr []和一个整数K ,任务是计算GCD等于K的所有三胞胎。
例子:

方法:
请按照以下步骤解决问题:

  1. 维护一个数组cnt [i] ,该数组表示GCD = i时数组中三元组的数目。
  2. 现在,要找到cnt [i] ,首先要计算存储在另一个数组mul [i]中i的所有倍数。
  3. 现在,从mul [i]中选择任意三个值。选择三个值的方式为mul [i] C 3 ,将此值存储在cnt [i]中
  4. 但是,它也包括具有GCD三胞胎的倍数。所以我们再次迭代所有i的倍数,并从CNT减去CNT [j]的[I]其中ji的倍数。
  5. 最终返回cnt [K]

下面是上述方法的实现:

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 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 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


输出:
Number of triplets with GCD 3 are 4


时间复杂度: O(N * log N)
辅助空间: O(N)