Problema de producto de subconjunto primo

Dada una array arr[] de N enteros. El valor de un subconjunto de la array A se define como el producto de todos los números primos de ese subconjunto. Si no hay números primos en el subconjunto, entonces el valor de ese subconjunto es 1 . La tarea es calcular el producto de los valores de todos los posibles subconjuntos no vacíos del módulo de array dado 100000007 .
Ejemplos: 
 

Entrada: arr[] = {3, 7} 
Salida: 441 
val({3}) = 3 
val({7}) = 7 
val({3, 7}) = 3 * 7 = 21 
3 * 7 * 21 = 441
Entrada: arr[] = {1, 1, 1} 
Salida:
 

Enfoque: Dado que se sabe que un número aparece 2 N – 1 veces en todo el subconjunto de la array dada de tamaño N . Entonces, si un número X es primo, la contribución de X será X * X * X * ….. * 2 N – 1 veces, es decir
 

Dado que 2 N – 1 también será un número grande, no se puede calcular directamente. Aquí se utilizará el teorema de Fermat para calcular la potencia.
 

Después de eso, el valor de cada elemento se puede calcular fácilmente.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include<bits/stdc++.h>
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<int> 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

<script>
 
// JavaScript implementation of the approach
 
function power(a, b, mod) {
    let aa = 1;
    while (b) {
        if (b & 1) {
            aa = aa * a;
            aa %= mod;
        }
        a = a * a;
        a %= mod;
        b = Math.floor(b / 2);
    }
    return aa;
}
 
// Function to return the prime subset
// product of the given array
function product(A, n) {
 
    // Create Sieve to check whether a
    // number is prime or not
    let N = 100010;
    let mod = 1000000007;
    let prime = new Array(N).fill(1);
    prime[0] = prime[1] = 0;
    let i = 2;
    while (i * i < N) {
        if (prime[i])
            for (let j = 2 * i;
                j <= N; j += i)
                prime[j] = 0;
 
        i += 1;
    }
 
    // Length of the array
    // Calculating 2^(n-1) % mod
    let t = power(2, n - 1, mod - 1);
 
    let ans = 1;
 
    for (let j = 0; j < n; j++) {
        let 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
 
let A = [3, 7];
 
let n = A.length;
 
document.write(product(A, n));
 
// This code is contributed by Saurabh Jaiswal
 
</script>
Producción: 

441

 

Publicación traducida automáticamente

Artículo escrito por adshin21 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *