📜  检查每个元素乘以整数时是否存在总和为1的子集

📅  最后修改于: 2022-05-13 01:56:09.233000             🧑  作者: Mango

检查每个元素乘以整数时是否存在总和为1的子集

给定一个正数数组arr[] 。任务是检查是否存在任何大小的子集,以便在将子集的每个元素与任何整数相乘后,将子集的总和设为 1。

例子:

方法:如果数组中任何一对数字的HCF1 ,则返回True否则返回False 。如果gcd(a, b) = 1 ,方程ax + by = 1x 和 y有解。无需检查所有可能对的 HCF,因为 GCD 是一个关联函数。

以此类推,包括所有可能的组合。所以只需遍历数组,直到找到1的 gcd。在另一个世界中,如果gcd(a0, a1, ..., an – 1) = 1,则存在#{ai0, ..., aik} = k, 1 <= k <= N的子序列aij ,其 gcd 为1 .请按照以下步骤解决问题:

  • 将变量res初始化为arr[0]。
  • 使用变量i遍历范围[1, N)并执行以下任务:
    • res的值设置为resarr[i] 的 gcd。
    • 如果res等于1,则返回true。
  • 执行上述步骤后,打印false作为答案。

下面是上述方法的实现:

C++
// C++ Program for the above approach
#include 
using namespace std;
 
// Function to find GCD
int gcd(int a, int b)
{
    if (a < b)
        gcd(b, a);
    if (a % b == 0)
        return b;
    else
        return gcd(b, a % b);
}
 
// Utility Function
bool IsArrayGood(int arr[], int N)
{
    int i, res = arr[0];
    for (i = 1; i < N; i++) {
        res = gcd(res, arr[i]);
        if (res == 1)
            return true;
    }
    return false;
}
 
// Driver Code
int main()
{
 
    int arr[] = { 12, 5, 9, 21 };
    int N = sizeof(arr) / sizeof(arr[0]);
    bool ver = IsArrayGood(arr, N);
 
    if (ver == true)
        cout << "True";
    else
        cout << "False";
 
    return 0;
}


Java
/*package whatever //do not write package name here */
import java.io.*;
import java.lang.*;
import java.util.*;
 
public class GFG {
 
  // Recursive function to return gcd of a and b
  static int gcd(int a, int b)
  {
    if (a < b)
      gcd(b, a);
    if (a % b == 0)
      return b;
    else
      return gcd(b, a % b);
  }
 
  // Utility Function
  static boolean IsArrayGood(int arr[], int N)
  {
    int i, res = arr[0];
    for (i = 1; i < N; i++) {
      res = gcd(res, arr[i]);
      if (res == 1)
        return true;
    }
    return false;
  }
 
 
  // Driver Code
  public static void main(String[] args)
  {
    int arr[] = { 12, 5, 9, 21 };
    int N = arr.length;
    boolean ver = IsArrayGood(arr, N);
 
    if (ver == true){
      System.out.println("True");
    }
    else{
      System.out.println("False");
    }
  }
}
 
// This code is contributed by hrithikgarg03188


Python3
# Python code for the above approach
 
# Function to find GCD
def gcd(a, b):
    if (a < b):
        gcd(b, a);
    if (a % b == 0):
        return b;
    else:
        return gcd(b, a % b);
 
# Utility Function
def IsArrayGood(arr, N):
    i = None
    res = arr[0];
    for i in range(1, N):
        res = gcd(res, arr[i]);
        if (res == 1):
            return True;
    return False;
 
# Driver Code
arr = [12, 5, 9, 21];
N = len(arr)
ver = IsArrayGood(arr, N);
 
if (ver == True):
    print("True");
else:
    print("False");
 
# This code is contributed by Saurabh Jaiswal


C#
/*package whatever //do not write package name here */
 
using System;
public class GFG {
 
  // Recursive function to return gcd of a and b
  static int gcd(int a, int b)
  {
    if (a < b)
      gcd(b, a);
    if (a % b == 0)
      return b;
    else
      return gcd(b, a % b);
  }
 
  // Utility Function
  static bool IsArrayGood(int[] arr, int N)
  {
    int i, res = arr[0];
    for (i = 1; i < N; i++) {
      res = gcd(res, arr[i]);
      if (res == 1)
        return true;
    }
    return false;
  }
 
 
  // Driver Code
  public static void Main()
  {
    int[] arr = { 12, 5, 9, 21 };
    int N = arr.Length;
    bool ver = IsArrayGood(arr, N);
 
    if (ver == true){
      Console.Write("True");
    }
    else{
      Console.Write("False");
    }
  }
}
 
// This code is contributed by gfgking


Javascript


输出
True

时间复杂度: O(N*log(D)) 其中 D 是数组中的最大元素
辅助空间: O(1)