📜  素子集积问题

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

素子集积问题

给定一个包含N个整数的数组arr[] 。数组A的子集的值定义为该子集中所有素数的乘积。如果子集中没有素数,则该子集的值为1 。任务是计算给定数组模数100000007的所有可能非空子集的值的乘积。
例子:

方法:由于已知一个数字在给定大小为N的数组的所有子集中出现2 N – 1次。所以如果一个数X是素数,那么 X 的贡献将是X * X * X * ..... * 2 N – 1倍,即

由于2 N – 1也会是一个很大的数,所以不能直接计算。此处将使用费马定理来计算功率。

之后,可以很容易地计算每个元素的值。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include
using namespace std;
 
int power(int a, int b, int mod)
{
    int aa = 1;
    while(b)
    {
        if(b & 1)
        {
            aa = aa * a;
            aa %= mod;
        }
        a = a * a;
        a %= mod;
        b /= 2;
    }
    return aa;
}
 
// Function to return the prime subset
// product of the given array
int product(int A[], int n)
{
 
    // Create Sieve to check whether a
    // number is prime or not
    int N = 100010;
    int mod = 1000000007;
    vector prime(N, 1);
    prime[0] = prime[1] = 0;
    int i = 2;
    while (i * i < N)
    {
        if (prime[i])
            for (int j = 2 * i;
                     j <= N;j += i)
                prime[j] = 0;
 
        i += 1;
    }
 
    // Length of the array
    // Calculating 2^(n-1) % mod
    int t = power(2, n - 1, mod - 1);
 
    int ans = 1;
 
    for (int j = 0; j < n; j++)
    {
        int i = A[j];
 
        // If element is prime then add
        // its contribution in the result
        if( prime[i])
        {
            ans *= power(i, t, mod);
            ans %= mod;
        }
    }
    return ans;
}
 
// Driver code
int main()
{
    int A[] = {3, 7};
     
    int n = sizeof(A) / sizeof(A[0]);
     
    printf("%d", product(A, n));
}
 
// This code is contributed by Mohit Kumar


Java
// Java implementation of the approach
class GFG
{
static int power(int a, int b, int mod)
{
    int aa = 1;
    while(b > 0)
    {
        if(b % 2 == 1)
        {
            aa = aa * a;
            aa %= mod;
        }
        a = a * a;
        a %= mod;
        b /= 2;
    }
    return aa;
}
 
// Function to return the prime subset
// product of the given array
static int product(int A[], int n)
{
 
    // Create Sieve to check whether a
    // number is prime or not
    int N = 100010;
    int mod = 1000000007;
    int []prime = new int[N];
    for (int j = 0; j < N; j++)
    {
        prime[j] = 1;
    }
     
    prime[0] = prime[1] = 0;
    int i = 2;
    while (i * i < N)
    {
        if (prime[i] == 1)
            for (int j = 2 * i;
                    j < N;j += i)
                prime[j] = 0;
 
        i += 1;
    }
 
    // Length of the array
    // Calculating 2^(n-1) % mod
    int t = power(2, n - 1, mod - 1);
 
    int ans = 1;
 
    for (int j = 0; j < n; j++)
    {
        i = A[j];
 
        // If element is prime then add
        // its contribution in the result
        if( prime[i] == 1)
        {
            ans *= power(i, t, mod);
            ans %= mod;
        }
    }
    return ans;
}
 
// Driver code
public static void main (String[] args)
{
    int A[] = {3, 7};
     
    int n = A.length;
     
    System.out.printf("%d", product(A, n));
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 implementation of the approach
 
# Function to return the prime subset
# product of the given array
def product(A):
     
    # Create Sieve to check whether a
    # number is prime or not
    N = 100010
    mod = 1000000007
    prime = [1] * N
    prime[0] = prime[1] = 0
    i = 2
    while i * i < N:
        if prime[i]:
            for j in range(i * i, N, i):
                prime[j] = 0
         
        i += 1
     
    # Length of the array
    n = len(A)
     
    # Calculating 2^(n-1) % mod
    t = pow(2, n-1, mod-1)
     
    ans = 1
     
    for i in A:
         
        # If element is prime then add
        # its contribution in the result
        if prime[i]:
            ans *= pow(i, t, mod)
            ans %= mod
             
    return ans
     
# Driver code
A = [3, 7]
print(product(A))


C#
// C# implementation of the approach
using System;
 
class GFG
{
static int power(int a, int b, int mod)
{
    int aa = 1;
    while(b > 0)
    {
        if(b % 2 == 1)
        {
            aa = aa * a;
            aa %= mod;
        }
        a = a * a;
        a %= mod;
        b /= 2;
    }
    return aa;
}
 
// Function to return the prime subset
// product of the given array
static int product(int []A, int n)
{
 
    // Create Sieve to check whether a
    // number is prime or not
    int N = 100010;
    int mod = 1000000007;
    int []prime = new int[N];
    for (int j = 0; j < N; j++)
    {
        prime[j] = 1;
    }
     
    prime[0] = prime[1] = 0;
    int i = 2;
    while (i * i < N)
    {
        if (prime[i] == 1)
            for (int j = 2 * i;
                     j < N; j += i)
                prime[j] = 0;
 
        i += 1;
    }
 
    // Length of the array
    // Calculating 2^(n-1) % mod
    int t = power(2, n - 1, mod - 1);
 
    int ans = 1;
 
    for (int j = 0; j < n; j++)
    {
        i = A[j];
 
        // If element is prime then add
        // its contribution in the result
        if( prime[i] == 1)
        {
            ans *= power(i, t, mod);
            ans %= mod;
        }
    }
    return ans;
}
 
// Driver code
public static void Main(String[] args)
{
    int []A = {3, 7};
     
    int n = A.Length;
     
    Console.Write("{0}", product(A, n));
}
}
     
// This code is contributed by Rajput-Ji


Javascript


输出:
441