给定一个数组arr[]大小N ,任务是找到与给定数组的任何元素不互质的最小数字。
例子:
Input: arr[] = {3, 4, 6, 7, 8, 9, 10}
Output: 42
Explanation: The prime factorization of array elements are:
3 = 3
4 = 2 * 2
6 = 2 * 3
7 = 7
8 = 2 * 2 * 2
9 = 3 * 3
10 = 2 * 5
Considering prime factors {2, 3, 7} to get the number X (= 2 * 3 * 7 = 42), which is not co-prime with any other array element.
Input: arr[] = {4, 3}
Output: 6
Explanation: The prime factorization of array elements are:
4 = 2 * 2
3 = 3
Considering prime factors {2, 3} to get the number X (= 2 * 3 = 6), which is not co-prime with any other array element.
方法:这个想法是基于这样的观察,即所需的数字,比如X,不应该与任何数组元素arr[i] 互质。必须存在一些公因数, d ≥ 2对于每个数组元素arr[i]可以整除arr[i]和X。可能的最小d是素数。因此,我们的想法是考虑一组素数,使得它们的乘积不会与所有数组元素互质,并找到可能的最小数。请按照以下步骤解决问题:
- 初始化一个变量,比如ans ,作为 INT_MAX 来存储所需的结果。
- 初始化一个数组primes[]来存储素数。
- 生成这个数组的所有子集,对于每个子集,将它的乘积存储在一个变量中,比如P。检查它是否与任何数组元素不互质。如果发现为真,则更新ans的值。
- 否则,移动到下一个子集。
- 完成以上步骤后,打印ans的值作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
#define ll long long int
#define MAX 50
// Function check if a
// number is prime or not
bool isPrime(ll n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Check for every 6th number. The above
// checking allows to skip middle 5 numbers
for (ll i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
// Function to store primes in an array
void findPrime(vector& primes)
{
for (ll i = 2; i <= MAX; i++) {
if (isPrime(i))
primes.push_back(i);
}
}
// Function to calculate
// GCD of two numbers
ll gcd(ll a, ll b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// Function to find the smallest
// number which is not coprime with
// any element of the array arr[]
void findMinimumNumber(ll arr[], ll N)
{
// Store the prime numbers
vector primes;
// Function call to fill
// the prime numbers
findPrime(primes);
// Stores the answer
ll ans = INT_MAX;
ll n = primes.size();
// Generate all non-empty
// subsets of the primes[] array
for (ll i = 1; i < (1 << n); i++) {
// Stores product of the primes
ll temp = 1;
for (ll j = 0; j < n; j++) {
if (i & (1 << j)) {
temp *= primes[j];
}
}
// Checks if temp is coprime
// with the array or not
bool check = true;
// Check if the product temp is
// not coprime with the whole array
for (ll k = 0; k < N; k++) {
if (gcd(temp, arr[k]) == 1) {
check = false;
break;
}
}
// If the product is not
// co-prime with the array
if (check)
ans = min(ans, temp);
}
// Print the answer
cout << ans;
}
// Driver Code
int main()
{
// Given array
ll arr[] = { 3, 4, 6, 7, 8, 9, 10 };
// Stores the size of the array
ll N = sizeof(arr) / sizeof(arr[0]);
findMinimumNumber(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
static long MAX = 50;
// Function check if a
// number is prime or not
static boolean isPrime(long n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Check for every 6th number. The above
// checking allows to skip middle 5 numbers
for(long i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
// Function to store primes in an array
static void findPrime(ArrayList primes)
{
for(long i = 2; i <= MAX; i++)
{
if (isPrime(i))
primes.add(i);
}
}
// Function to calculate
// GCD of two numbers
static long gcd(long a, long b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// Function to find the smallest
// number which is not coprime with
// any element of the array arr[]
static void findMinimumNumber(long []arr, long N)
{
ArrayList primes = new ArrayList();
// Function call to fill
// the prime numbers
findPrime(primes);
// Stores the answer
long ans = 2147483647;
int n = primes.size();
// Generate all non-empty
// subsets of the primes[] array
for(int i = 1; i < (1 << n); i++)
{
// Stores product of the primes
long temp = 1;
for(int j = 0; j < n; j++)
{
if ((i & (1 << j)) > 0)
{
temp *= primes.get(j);
}
}
// Checks if temp is coprime
// with the array or not
boolean check = true;
// Check if the product temp is
// not coprime with the whole array
for(long k = 0; k < N; k++)
{
if (gcd(temp, arr[(int)k]) == 1l)
{
check = false;
break;
}
}
// If the product is not
// co-prime with the array
if (check == true)
ans = Math.min(ans, temp);
}
// Prlong the answer
System.out.print(ans);
}
// Driver code
public static void main (String[] args)
{
// Given array
long []arr = { 3, 4, 6, 7, 8, 9, 10 };
// Stores the size of the array
long N = arr.length;
findMinimumNumber(arr, N);
}
}
// This code is contributed by offbeat
Python3
# Python 3 program for the above approach
MAX = 50
import sys
from math import sqrt,gcd
# Function check if a
# number is prime or not
def isPrime(n):
# Corner cases
if (n <= 1):
return False
if (n <= 3):
return True
# Check if n is divisible by 2 or 3
if (n % 2 == 0 or n % 3 == 0):
return False
# Check for every 6th number. The above
# checking allows to skip middle 5 numbers
for i in range(5,int(sqrt(n))+1,6):
if (n % i == 0 or n % (i + 2) == 0):
return False
return True
# Function to store primes in an array
def findPrime(primes):
global MAX
for i in range(2, MAX + 1, 1):
if(isPrime(i)):
primes.append(i)
# Function to find the smallest
# number which is not coprime with
# any element of the array arr[]
def findMinimumNumber(arr, N):
# Store the prime numbers
primes = []
# Function call to fill
# the prime numbers
findPrime(primes)
# Stores the answer
ans = sys.maxsize
n = len(primes)
# Generate all non-empty
# subsets of the primes[] array
for i in range(1, (1 << n), 1):
# Stores product of the primes
temp = 1
for j in range(n):
if (i & (1 << j)):
temp *= primes[j]
# Checks if temp is coprime
# with the array or not
check = True
# Check if the product temp is
# not coprime with the whole array
for k in range(N):
if (gcd(temp, arr[k]) == 1):
check = False
break
# If the product is not
# co-prime with the array
if (check):
ans = min(ans, temp)
# Print the answer
print(ans)
# Driver Code
if __name__ == '__main__':
# Given array
arr = [3, 4, 6, 7, 8, 9, 10]
# Stores the size of the array
N = len(arr)
findMinimumNumber(arr, N)
# This code is contributed by ipg2016107.
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG{
static long MAX = 50;
// Function check if a
// number is prime or not
static bool isPrime(long n)
{
// Corner cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Check for every 6th number. The above
// checking allows to skip middle 5 numbers
for(long i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
// Function to store primes in an array
static void findPrime(List primes)
{
for(long i = 2; i <= MAX; i++)
{
if (isPrime(i))
primes.Add(i);
}
}
// Function to calculate
// GCD of two numbers
static long gcd(long a, long b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// Function to find the smallest
// number which is not coprime with
// any element of the array arr[]
static void findMinimumNumber(long []arr, long N)
{
List primes = new List();
// Function call to fill
// the prime numbers
findPrime(primes);
// Stores the answer
long ans = 2147483647;
int n = primes.Count;
// Generate all non-empty
// subsets of the primes[] array
for(int i = 1; i < (1 << n); i++)
{
// Stores product of the primes
long temp = 1;
for(int j = 0; j < n; j++)
{
if ((i & (1 << j)) > 0)
{
temp *= primes[j];
}
}
// Checks if temp is coprime
// with the array or not
bool check = true;
// Check if the product temp is
// not coprime with the whole array
for(long k = 0; k < N; k++)
{
if (gcd(temp, arr[k]) == 1)
{
check = false;
break;
}
}
// If the product is not
// co-prime with the array
if (check == true)
ans = Math.Min(ans, temp);
}
// Prlong the answer
Console.Write(ans);
}
// Driver Code
public static void Main()
{
// Given array
long []arr = { 3, 4, 6, 7, 8, 9, 10 };
// Stores the size of the array
long N = arr.Length;
findMinimumNumber(arr, N);
}
}
// This code is contributed by SURENDRA_GANGWAR
Javascript
42
时间复杂度: O(2 M *N*log(X)),其中M是数组primes[]的大小, X是数组arr[] 中的最小元素
辅助空间: O(M)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live