📜  二的幂和子序列

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

二的幂和子序列

给定一个大小为 N 的数组,找到子序列的计数,这些子序列相乘时的结果是 2 的幂。

例子:

Input : A[] = {1, 2, 3}
Output : 3
Explanation: There are 3 such subsequences {1}, 
{2} and {1, 2}.

Input : A[] = {3, 5, 9}
Output : 0
Explanation: There is no such subsequence.

从 2 的幂的性质可以看出,它只能表示为数字的乘积,而数字本身就是 2 的幂。所以首先我们遍历数组并计算数组中为 2 的幂的数字的总数。假设数组中有 N 个这样的数字。我们可以选择 1 或 2 或 3 或 ... 或 N 个这样的数字来得到一个子序列,当相乘时会得到一个数字,该数字是 2 的幂。
因此,所需的答案将是:

答案= {{N}\choose{1}} + {{N}\choose{2}} + … + {{N}\choose{N}}

答案= 2^{N}-1

下面是上述想法的实现。

C++
// CPP program to count number of subsequences
// which when multiplied result in a power of 2.
#include 
using namespace std;
  
// Function to check if num is power of 
// two or not.
bool isPowerOf2(int num)
{
    if (num == 0)
        return false;
  
    if (num == 1)
        return true;
  
    if (num & (num - 1))
        return false;
  
    return true;
}
  
// counting all subsequences whose product
// is power of 2.
int countSubsequence(int a[], int size)
{
    int count = 0;
    for (int i = 0; i < size; i++) 
        if (isPowerOf2(a[i]))
            count++;
    return (int)(pow(2, count)) - 1;
}
  
// Driver code
int main()
{
    int a[] = { 1, 2, 3 };
    cout << countSubsequence(a, 3) << endl;
    int b[] = { 3, 5, 9 };
    cout << countSubsequence(b, 3) << endl;
    return 0;
}


Java
// JAVA program to count number of 
// subsequences which when multiplied 
// result in a power of 2.
import java.io.*;
import java.math.*;
  
class GFG {
      
    // Function to check if num is 
    // power of two or not.
    static boolean isPowerOf2(int num)
    {
        if (num == 0)
            return false;
       
        if (num == 1)
            return true;
       
        if (num / 2 == (num - 1) / 2)
            return false;
       
        return true;
    }
       
    // counting all subsequences whose
    // product is power of 2.
    static int countSubsequence(int a[], 
                                int size)
    {
        int count = 0;
        for (int i = 0; i < size; i++) 
            if (isPowerOf2(a[i]))
                count++;
        return (int)(Math.pow(2, count)) - 1;
    }
       
    // Driver 
    public static void main(String args[])
    {
        int a[] = { 1, 2, 3 };
        System.out.println(countSubsequence(a, 3));
        int b[] = { 3, 5, 9 };
        System.out.println(countSubsequence(b, 3)) ;
    }
}
  
/*This code is contributed by Nikita Tiwari.*/


Python
# Python program to count number of 
# subsequences which when multiplied
# result in a power of 2.
  
# Function to check if num is power
# of two or not.
def isPowerOf2(num) :
    if (num == 0) :
        return False
   
    if (num == 1) :
        return True
   
    if (num & (num - 1)) :
        return False
   
    return True
  
# counting all subsequences whose
# product is power of 2.
def countSubsequence(a, size) :
    count = 0
    for i in range(0,size) :
        if (isPowerOf2(a[i])) :
            count = count + 1
    return (int)(pow(2, count)) - 1
   
# Driver code
a = [ 1, 2, 3 ];
print countSubsequence(a, 3)
b = [ 3, 5, 9 ]
print countSubsequence(b, 3)
  
# This code is contributed by Nikita Tiwari


C#
// C# program to count number of 
// subsequences which when multiplied 
// result in a power of 2.
using System;
  
class GFG {
      
    // Function to check if num is 
    // power of two or not.
    static bool isPowerOf2(int num)
    {
        if (num == 0)
            return false;
      
        if (num == 1)
            return true;
      
        if (num / 2 == (num - 1) / 2)
            return false;
      
        return true;
    }
      
    // counting all subsequences whose
    // product is power of 2.
    static int countSubsequence(int []a, 
                                int size)
    {
        int count = 0;
        for (int i = 0; i < size; i++) 
            if (isPowerOf2(a[i]))
                count++;
        return (int)(Math.Pow(2, count)) - 1;
    }
      
    // Driver  code
    public static void Main()
    {
        int []a = { 1, 2, 3 };
        Console.WriteLine(countSubsequence(a, 3));
        int []b = { 3, 5, 9 };
        Console.WriteLine(countSubsequence(b, 3)) ;
    }
}
  
/*This code is contributed by vt_m.*/


PHP


Javascript



输出:
3
0