具有最大可能GCD的大小为k的子序列

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

null

例如:

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

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

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

C++

// CPP program to find subsequence of size
// k with maximum possible GCD.
#include <bits/stdc++.h>
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.


Javascript

<script>
// Javascript program to find
// subsequence of size
// k with maximum possible GCD
// function to find GCD of
// sub sequence of size k
// with max GCD in the array
function findMaxGCD(arr,n,k)
{
arr.sort( function (a,b){ return a-b;});
// Computing highest element
let high = arr[n - 1];
// Array to store the
// count of divisors
// i.e. Potential GCDs
let divisors = new Array(high + 1);
for (let i=0;i<divisors.length;i++)
{
divisors[i]=0;
}
// Iterating over
// every element
for (let i = 0; i < n; i++)
{
// Calculating all the divisors
for (let 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 != Math.floor(arr[i] / j))
divisors[Math.floor(arr[i] / j)]++;
}
}
}
// Checking the highest
// potential GCD
for (let 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
let arr=[1, 2, 4,
8, 8, 12];
let k = 3;
let n = arr.length;
document.write(findMaxGCD(arr, n, k));
// This code is contributed by rag2127
</script>


输出:

4

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享