我们得到了一个正整数和一个整数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