转换数组,使数组的GCD变为1

给定一个正元素数组和一个正整数k,任务是将数组的GCD转换为1。为了实现这一点,任意次数只允许进行一次操作,即选择数组中的任何元素,并用数字d除以,其中d<=k。 例如:

null

输入:arr={10,15,30},k=6 输出:是的 按原样将数组的所有元素除以5 所有元素的除数,也小于k,即6。 它给出了类似于{2,3,6}的序列。现在,分开 2乘2,3乘3,6乘2。然后是序列 变成{1,1,3}。现在,阵列的gcd为1。 输入:arr={5,10,20},k=4 输出:否 这里,将10除以2,序列变为 {5, 5, 20}. 然后,将20除以2,再除以2。 最后,序列变成{5,5,5}。使 序列1的gcd除以每个元素 五点之前。但是5>4,所以这里不可能 gcd 1。

方法:

  • 如果存在一个大于k的正素数,将数组中的每个元素分开,那么答案是否定的。
  • 如果数组的GCD的最大素因子小于或等于k,则答案是肯定的。
  • 首先,找到数组的GCD,然后检查GCD的素因子是否大于k。
  • 为此,计算GCD的最大素因子。

C++

// C++ program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
#include <bits/stdc++.h>
using namespace std;
// Function to get gcd of the array.
int getGcd( int * arr, int n)
{
int gcd = arr[0];
for ( int i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
// Function to check if it is possible.
bool convertGcd( int * arr, int n, int k)
{
// Getting the gcd of array
int gcd = getGcd(arr, n);
// Initially taking max_prime factor is 1.
int max_prime = 1;
// find maximum of all the prime factors
// till sqrt(gcd).
for ( int i = 2; i <= sqrt (gcd); i++) {
while (gcd % i == 0) {
gcd /= i;
max_prime = max(max_prime, i);
}
}
// either GCD is reduced to 1 or a prime factor
// greater than sqrt(gcd)
max_prime = max(max_prime, gcd);
return (max_prime <= k);
}
// Drivers code
int main()
{
int arr[] = { 10, 15, 30 };
int k = 6;
int n = sizeof (arr) / sizeof (arr[0]);
if (convertGcd(arr, n, k) == true )
cout << "Yes" ;
else
cout << "No" ;
return 0;
}


JAVA

// Java program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
import java.io.*;
class GFG {
// Recursive function to return
// gcd of a and b
static int __gcd( int a, int b)
{
// Everything divides 0
if (a == 0 || b == 0 )
return 0 ;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
// Function to get gcd of the array.
static int getGcd( int arr[], int n)
{
int gcd = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
// Function to check if it is possible.
static boolean convertGcd( int []arr,
int n, int k)
{
// Getting the gcd of array
int gcd = getGcd(arr, n);
// Initially taking max_prime
// factor is 1.
int max_prime = 1 ;
// find maximum of all the prime
// factors till sqrt(gcd).
for ( int i = 2 ; i <= Math.sqrt(gcd);
i++)
{
while (gcd % i == 0 ) {
gcd /= i;
max_prime =
Math.max(max_prime, i);
}
}
// either GCD is reduced to 1 or a
// prime factor greater than sqrt(gcd)
max_prime = Math.max(max_prime, gcd);
return (max_prime <= k);
}
// Drivers code
public static void main (String[] args)
{
int []arr = { 10 , 15 , 30 };
int k = 6 ;
int n = arr.length;
if (convertGcd(arr, n, k) == true )
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
// This code is contributed by anuj_67.


Python3

# Python 3 program to check if it is
# possible to convert the gcd of
# the array to 1 by applying the
# given operation
from math import gcd as __gcd, sqrt
# Function to get gcd of the array.
def getGcd(arr, n):
gcd = arr[ 0 ];
for i in range ( 1 , n, 1 ):
gcd = __gcd(arr[i], gcd)
return gcd
# Function to check if it is possible.
def convertGcd(arr, n, k):
# Getting the gcd of array
gcd = getGcd(arr, n)
# Initially taking max_prime
# factor is 1.
max_prime = 1
# find maximum of all the
# prime factors till sqrt(gcd)
p = int (sqrt(gcd)) + 1
for i in range ( 2 , p, 1 ):
while (gcd % i = = 0 ):
gcd = int (gcd / i)
max_prime = max (max_prime, i)
# either GCD is reduced to 1 or a
# prime factor greater than sqrt(gcd)
max_prime = max (max_prime, gcd)
return (max_prime < = k)
# Drivers code
if __name__ = = '__main__' :
arr = [ 10 , 15 , 30 ]
k = 6
n = len (arr)
if (convertGcd(arr, n, k) = = True ):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by
# Sahil_Shelangia


C#

// C# program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
using System;
class GFG {
// Recursive function to return
// gcd of a and b
static int __gcd( int a, int b)
{
// Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
// Function to get gcd of the array.
static int getGcd( int []arr, int n)
{
int gcd = arr[0];
for ( int i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
// Function to check if it is possible.
static bool convertGcd( int []arr,
int n, int k)
{
// Getting the gcd of array
int gcd = getGcd(arr, n);
// Initially taking max_prime
// factor is 1.
int max_prime = 1;
// find maximum of all the prime
// factors till sqrt(gcd).
for ( int i = 2; i <= Math.Sqrt(gcd);
i++)
{
while (gcd % i == 0) {
gcd /= i;
max_prime =
Math.Max(max_prime, i);
}
}
// either GCD is reduced to 1 or a
// prime factor greater than sqrt(gcd)
max_prime = Math.Max(max_prime, gcd);
return (max_prime <= k);
}
// Drivers code
public static void Main ()
{
int []arr = { 10, 15, 30 };
int k = 6;
int n = arr.Length;
if (convertGcd(arr, n, k) == true )
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
// This code is contributed by anuj_67.


PHP

<?php
// PHP program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
// Recursive function to
// return gcd of a and b
function __gcd( $a , $b )
{
// Everything divides 0
if ( $a == 0 or $b == 0)
return 0 ;
// base case
if ( $a == $b )
return $a ;
// a is greater
if ( $a > $b )
return __gcd( $a - $b , $b ) ;
return __gcd( $a , $b - $a ) ;
}
// Function to get gcd of the array.
function getGcd( $arr , $n )
{
$gcd = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$gcd = __gcd( $arr [ $i ], $gcd );
return $gcd ;
}
// Function to check if it is possible.
function convertGcd( $arr , $n , $k )
{
// Getting the gcd of array
$gcd = getGcd( $arr , $n );
// Initially taking max_prime
// factor is 1.
$max_prime = 1;
// find maximum of all the prime
// factors till sqrt(gcd).
for ( $i = 2; $i <= sqrt( $gcd ); $i ++)
{
while ( $gcd % $i == 0)
{
$gcd /= $i ;
$max_prime = max( $max_prime , $i );
}
}
// either GCD is reduced
// to 1 or a prime factor
// greater than sqrt(gcd)
$max_prime = max( $max_prime , $gcd );
return ( $max_prime <= $k );
}
// Driver Code
$arr = array (10, 15, 30);
$k = 6;
$n = count ( $arr );
if (convertGcd( $arr , $n , $k ) == true)
echo "Yes" ;
else
echo "No" ;
// This code is contributed by anuj_67.
?>


Javascript

<script>
// Javascript program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
// Recursive function to return
// gcd of a and b
function __gcd(a, b)
{
// Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
// Function to get gcd of the array.
function getGcd(arr, n)
{
let gcd = arr[0];
for (let i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
// Function to check if it is possible.
function convertGcd(arr, n, k)
{
// Getting the gcd of array
let gcd = getGcd(arr, n);
// Initially taking max_prime
// factor is 1.
let max_prime = 1;
// find maximum of all the prime
// factors till sqrt(gcd).
for (let i = 2; i <= Math.sqrt(gcd); i++)
{
while (gcd % i == 0) {
gcd = parseInt(gcd / i, 10);
max_prime = Math.max(max_prime, i);
}
}
// either GCD is reduced to 1 or a
// prime factor greater than sqrt(gcd)
max_prime = Math.max(max_prime, gcd);
return (max_prime <= k);
}
let arr = [ 10, 15, 30 ];
let k = 6;
let n = arr.length;
if (convertGcd(arr, n, k) == true )
document.write( "Yes" );
else
document.write( "No" );
// This code is contributed by divyesh072019.
</script>


输出:

Yes

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