📌  相关文章
📜  具有最大可能GCD的大小为k的子序列

📅  最后修改于: 2021-04-26 19:08:59             🧑  作者: Mango

我们得到了一个正整数和一个整数k的数组。找到大小为k的子序列的最大可能GCD。

例子:

Input : arr[] = [2, 1, 4, 6] k = 3
Output : 2
GCD of [2, 4, 6] is 2

Input : arr[] = [1, 2, 3] k = 3
Output : 1
GCD of [1, 2, 3] is 1

方法1逐一生成大小为k的所有子序列,然后找到所有此类生成的子序列的GCD。打印找到的最大的GCD。

方法2在此方法中,我们维护一个count数组来存储每个元素的除数的数量。我们将遍历给定的数组,并为每个元素计算其除数,并在count数组的索引处递增。计算除数的过程将花费O(sqrt(arr [i]))时间,其中arr [i]是给定数组在索引i处的元素。在整个遍历之后,我们可以简单地将计数数组从最后一个索引遍历到索引1。如果我们找到一个索引值等于或大于k的索引,则这意味着它是至少k个元素的除数,也是max的除数。 GCD。

C++
// CPP program to find subsequence of size
// k with maximum possible GCD.
#include 
using namespace std;
  
// function to find GCD of sub sequence of
// size k with max GCD in the array
int findMaxGCD(int arr[], int n, int k)
{
    // Computing highest element
    int high = *max_element(arr, arr+n);
  
    // Array to store the count of divisors
    // i.e. Potential GCDs
    int divisors[high + 1] = { 0 };
  
    // Iterating over every element
    for (int i = 0; i < n; i++) {
  
        // Calculating all the divisors
        for (int j = 1; j <= sqrt(arr[i]); j++) {
  
            // Divisor found
            if (arr[i] % j == 0) {
  
                // Incrementing count for divisor
                divisors[j]++;
  
                // Element/divisor is also a divisor
                // Checking if both divisors are
                // not same
                if (j != arr[i] / j)
                    divisors[arr[i] / j]++;
            }
        }
    }
  
    // Checking the highest potential GCD
    for (int i = high; i >= 1; i--)
  
        // If this divisor can divide at least k
        // numbers, it is a GCD of at least one
        // sub sequence of size k
        if (divisors[i] >= k)
            return i;
}
  
// Driver code
int main()
{
    // Array in which sub sequence with size
    // k with max GCD is to be found
    int arr[] = { 1, 2, 4, 8, 8, 12 };
    int k = 3;
  
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << findMaxGCD(arr, n, k);
    return 0;
}


Java
// Java program to find
// subsequence of size
// k with maximum possible GCD
import java .io.*;
import java .util.*;
  
class GFG
{
  
// function to find GCD of 
// sub sequence of size k
// with max GCD in the array
static int findMaxGCD(int []arr,
                      int n, int k)
{
    Arrays.sort(arr);
      
    // Computing highest element
    int high = arr[n - 1];
  
    // Array to store the 
    // count of divisors
    // i.e. Potential GCDs
    int []divisors = new int[high + 1];
  
    // Iterating over 
    // every element
    for (int i = 0; i < n; i++)
    {
  
        // Calculating all the divisors
        for (int j = 1;             
                 j <= Math.sqrt(arr[i]); 
                 j++)
        {
  
            // Divisor found
            if (arr[i] % j == 0) 
            {
  
                // Incrementing count
                // for divisor
                divisors[j]++;
  
                // Element/divisor is 
                // also a divisor Checking
                // if both divisors are
                // not same
                if (j != arr[i] / j)
                    divisors[arr[i] / j]++;
            }
        }
    }
  
    // Checking the highest
    // potential GCD
    for (int i = high; i >= 1; i--)
  
        // If this divisor can divide 
        // at least k numbers, it is 
        // a GCD of at least one sub 
        // sequence of size k
        if (divisors[i] >= k)
            return i;
            return 0 ;
}
  
// Driver code
static public void main (String[] args)
{
    // Array in which sub sequence 
    // with size k with max GCD is 
    // to be found
    int []arr = { 1, 2, 4, 
                  8, 8, 12 };
    int k = 3;
  
    int n = arr.length;
    System.out.println(findMaxGCD(arr, n, k));
}
}
  
// This code is contributed 
// by anuj_67.


Python 3
# Python 3 program to find subsequence 
# of size k with maximum possible GCD.
import math
  
# function to find GCD of sub sequence 
# of size k with max GCD in the array
def findMaxGCD(arr, n, k):
  
    # Computing highest element
    high = max(arr)
  
    # Array to store the count of 
    # divisors i.e. Potential GCDs
    divisors = [0] * (high + 1)
  
    # Iterating over every element
    for i in range(n) :
  
        # Calculating all the divisors
        for j in range(1, int(math.sqrt(arr[i])) + 1):
  
            # Divisor found
            if (arr[i] % j == 0) :
  
                # Incrementing count for divisor
                divisors[j] += 1
  
                # Element/divisor is also a divisor
                # Checking if both divisors are
                # not same
                if (j != arr[i] // j):
                    divisors[arr[i] // j] += 1
  
    # Checking the highest potential GCD
    for i in range(high, 0, -1):
  
        # If this divisor can divide at least k
        # numbers, it is a GCD of at least one
        # sub sequence of size k
        if (divisors[i] >= k):
            return i
  
# Driver code
if __name__ == "__main__":
  
    # Array in which sub sequence with size
    # k with max GCD is to be found
    arr = [ 1, 2, 4, 8, 8, 12 ]
    k = 3
  
    n = len(arr)
    print(findMaxGCD(arr, n, k))
  
# This code is contributed by ita_c


C#
// C# program to find subsequence of size
// k with maximum possible GCD
using System;
using System.Linq;
  
public class GFG {
      
    // function to find GCD of sub sequence of
    // size k with max GCD in the array
    static int findMaxGCD(int []arr, int n, int k)
    {
        // Computing highest element
        int high = arr.Max();
      
        // Array to store the count of divisors
        // i.e. Potential GCDs
        int []divisors = new int[high+1];
      
        // Iterating over every element
        for (int i = 0; i < n; i++) {
      
            // Calculating all the divisors
            for (int j = 1; j <= Math.Sqrt(arr[i]); j++)
            {
      
                // Divisor found
                if (arr[i] % j == 0) {
      
                    // Incrementing count for divisor
                    divisors[j]++;
      
                    // Element/divisor is also a divisor
                    // Checking if both divisors are
                    // not same
                    if (j != arr[i] / j)
                        divisors[arr[i] / j]++;
                }
            }
        }
      
        // Checking the highest potential GCD
        for (int i = high; i >= 1; i--)
      
            // If this divisor can divide at least k
            // numbers, it is a GCD of at least one
            // sub sequence of size k
            if (divisors[i] >= k)
                return i;
                return 0 ;
    }
      
    // Driver code
    static public void Main ()
    {
        // Array in which sub sequence with 
        // size k with max GCD is to be found
        int []arr = { 1, 2, 4, 8, 8, 12 };
        int k = 3;
      
        int n = arr.Length;
        Console.WriteLine(findMaxGCD(arr, n, k));
    }
}
  
// This code is contributed by anuj_67.


输出:
4