Skip to content
Related Articles

Related Articles

Reduce sum of any subset of an array to 1 by multiplying all its elements by any value
  • Difficulty Level : Expert
  • Last Updated : 30 Apr, 2021

Given an array arr[] consisting of N positive integers, the task is to check if the sum of the elements of any subset of the given array can be reduced to 1 after multiplying all its elements by any integer. If it is not possible to do so, then print “No”. Otherwise, print “Yes”.

Examples:

Input: arr[] = {29, 6, 4, 10}
Output: Yes
Explanation:
Choose a subset {29, 6, 10} and multiply each corresponding element by {1, -3, -1}.
Therefore, sum of the subset = 29 * (1) + 6 * (-3) + 10 * (-1) = 29 – 18 – 10 = 1.
Therefore, print “Yes”.

Input: arr[] = {6, 3, 9}
Output: No

Naive Approach: The simplest approach is to generate all possible subsets of the given array and if there exists any subset in the array such that the sum of its elements, after being multiplied by any integer, results to 1, then print “Yes”. Otherwise print “No”
Time Complexity: O(N * 2N
Auxiliary Space: O(1)
 

Efficient Approach: The above approach can also be optimized by using Bezout’s identity (Bezout’s lemma), which states that if the GCD of any two integers a and b is equal to d, then there exists integers x and y, such that a * x + b * y = d.

 



Therefore, the idea is to check if the GCD of the given array arr[] can be made 1 or not. Hence, to satisfy the given condition, there must exist any two elements whose GCD is 1, then the GCD of the array will be equal to 1. Hence, print “Yes”. Otherwise, print “No”.

 

Below is the implementation of the above approach:

 

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return gcd of a and b
int gcd(int a, int b)
{
    // Base Case
    if (a == 0)
        return b;
 
    // Find the GCD recursively
    return gcd(b % a, a);
}
 
// Function to calculate the GCD
// of the array arr[]
int findGCDofArray(int arr[], int N)
{
    // Stores the GCD of array
    int g = 0;
 
    // Travese the array arr[]
    for (int i = 0; i < N; i++) {
 
        // Update gcd of the array
        g = gcd(g, arr[i]);
 
        // If gcd is 1, then return 1
        if (g == 1) {
            return 1;
        }
    }
 
    // Return the resultant GCD
    return g;
}
 
// Function to check if a subset satisfying
// the given condition exists or not
void findSubset(int arr[], int N)
{
 
    // Calculate the gcd of the array
    int gcd = findGCDofArray(arr, N);
 
    // If gcd is 1, then print Yes
    if (gcd == 1) {
        cout << "Yes";
    }
 
    // Otherwise, print No
    else {
        cout << "No";
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 29, 6, 4, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
    findSubset(arr, N);
 
    return 0;
}

Java




// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG
{
 
  // Function to return gcd of a and b
  static int gcd(int a, int b)
  {
 
    // Base Case
    if (a == 0)
      return b;
 
    // Find the GCD recursively
    return gcd(b % a, a);
  }
 
  // Function to calculate the GCD
  // of the array arr[]
  static int findGCDofArray(int arr[], int N)
  {
 
    // Stores the GCD of array
    int g = 0;
 
    // Travese the array arr[]
    for (int i = 0; i < N; i++)
    {
 
      // Update gcd of the array
      g = gcd(g, arr[i]);
 
      // If gcd is 1, then return 1
      if (g == 1) {
        return 1;
      }
    }
 
    // Return the resultant GCD
    return g;
  }
 
  // Function to check if a subset satisfying
  // the given condition exists or not
  static void findSubset(int arr[], int N)
  {
 
    // Calculate the gcd of the array
    int gcd = findGCDofArray(arr, N);
 
    // If gcd is 1, then print Yes
    if (gcd == 1) {
      System.out.println("Yes");
    }
 
    // Otherwise, print No
    else {
      System.out.println("No");
    }
  }
 
  // Driver code
  public static void main(String[] args)
  {
 
    // Given array
    int arr[] = { 29, 6, 4, 10 };
 
    // length of the array
    int N = arr.length;
 
    // function call
    findSubset(arr, N);
  }
}
 
// This code is contributed by Kingash.

Python3




# Python3 program for the above approach
 
# Function to return gcd of a and b
def gcd(a, b):
     
    # Base Case
    if (a == 0):
        return b
 
    # Find the GCD recursively
    return gcd(b % a, a)
 
# Function to calculate the GCD
# of the array arr[]
def findGCDofArray(arr, N):
     
    # Stores the GCD of array
    g = 0
 
    # Travese the array arr[]
    for i in range(N):
 
        # Update gcd of the array
        g = gcd(g, arr[i])
 
        # If gcd is 1, then return 1
        if (g == 1):
            return 1
 
    # Return the resultant GCD
    return g
 
# Function to check if a subset satisfying
# the given condition exists or not
def findSubset(arr, N):
 
    # Calculate the gcd of the array
    gcd = findGCDofArray(arr, N)
 
    # If gcd is 1, then prYes
    if (gcd == 1):
        print("Yes")
     
    # Otherwise, prNo
    else:
        print("No")
 
# Driver Code
if __name__ == '__main__':
    arr = [29, 6, 4, 10]
 
    N = len(arr)
 
    findSubset(arr, N)
 
    # This code is contributed by mohit kumar 29.

C#




// C# program for the above approach
using System;
class GFG
{
 
  // Function to return gcd of a and b
  static int gcd(int a, int b)
  {
 
    // Base Case
    if (a == 0)
      return b;
 
    // Find the GCD recursively
    return gcd(b % a, a);
  }
 
  // Function to calculate the GCD
  // of the array arr[]
  static int findGCDofArray(int[] arr, int N)
  {
 
    // Stores the GCD of array
    int g = 0;
 
    // Travese the array arr[]
    for (int i = 0; i < N; i++) {
 
      // Update gcd of the array
      g = gcd(g, arr[i]);
 
      // If gcd is 1, then return 1
      if (g == 1) {
        return 1;
      }
    }
 
    // Return the resultant GCD
    return g;
  }
 
  // Function to check if a subset satisfying
  // the given condition exists or not
  static void findSubset(int[] arr, int N)
  {
 
    // Calculate the gcd of the array
    int gcd = findGCDofArray(arr, N);
 
    // If gcd is 1, then print Yes
    if (gcd == 1) {
      Console.Write("Yes");
    }
 
    // Otherwise, print No
    else {
      Console.Write("No");
    }
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int[] arr = { 29, 6, 4, 10 };
    int N = arr.Length;
    findSubset(arr, N);
  }
}
 
// This code is contributed by shivani

Javascript




<script>
// javascript program for the above approach
    // Function to return gcd of a and b
    function gcd(a , b) {
 
        // Base Case
        if (a == 0)
            return b;
 
        // Find the GCD recursively
        return gcd(b % a, a);
    }
 
    // Function to calculate the GCD
    // of the array arr
    function findGCDofArray(arr , N) {
 
        // Stores the GCD of array
        var g = 0;
 
        // Travese the array arr
        for (i = 0; i < N; i++) {
 
            // Update gcd of the array
            g = gcd(g, arr[i]);
 
            // If gcd is 1, then return 1
            if (g == 1) {
                return 1;
            }
        }
 
        // Return the resultant GCD
        return g;
    }
 
    // Function to check if a subset satisfying
    // the given condition exists or not
    function findSubset(arr , N) {
 
        // Calculate the gcd of the array
        var gcd = findGCDofArray(arr, N);
 
        // If gcd is 1, then prvar Yes
        if (gcd == 1) {
            document.write("Yes");
        }
 
        // Otherwise, prvar No
        else {
            document.write("No");
        }
    }
 
    // Driver code
     
 
        // Given array
        var arr = [ 29, 6, 4, 10 ];
 
        // length of the array
        var N = arr.length;
 
        // function call
        findSubset(arr, N);
 
// This code contributed by gauravrajput1
</script>
Output: 
Yes

 

Time Complexity: O(N * log(M)), where M is the smallest element of the array.
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :