📜  从数组中对数进行计数,并得到不同素数的偶数乘积

📅  最后修改于: 2021-05-17 18:49:57             🧑  作者: Mango

给定分别由NM个整数组成的两个数组A []B [] ,任务是对对(A [i],B [j])进行计数,以使它们的不同素因数的乘积为偶数。

例子:

简单方法:最简单的方法是将生成的所有可能的对(A [I],B [j])从两个阵列以及对于每一对,计算的不同的素因子华氏度数组元素的计数和检查,如果他们的产品是连或不。如果发现为真,则增加此类对的计数。
时间复杂度: O(N 5/2 )
辅助空间: O(1)

高效方法:可以通过以下方法优化上述方法 预先计算所有数字的不同素数的计数 取决于 两个数组中最大的元素,并使用两个数字乘积以下属性

请按照以下步骤解决问题:

  • 首先,计算最大为MAX的所有数字的不同素数,并将其存储在vector 中,例如countDistinct。
  • 初始化两个变量,例如evenCount和奇数计数以将元素的计数存储为B []中数组元素的不同素数的偶数和奇数计数。
  • 遍历数组B []。如果countDistinct [B [i]] = 0 ,则跳过此步骤。如果是奇数,增量oddCount 1。否则,增量evenCount一个。
  • 将变量evenPairs初始化为0
  • 通过evenCount遍历数组A []和增量evenPairs如果countDistinct [A [I]]为奇数。
  • 否则,将evenPairs增加evenCount +奇数。
  • 打印evenPairs的值

下面是上述方法的实现:

C++
// C++ implementation of
// the above appraoch
 
#include 
using namespace std;
#define MAX 1000000
 
// Function to calculate count of
// distinct prime factors of a number
void countOfPrimefactors(vector& CountDistinct)
{
    bool prime[MAX + 1];
 
    for (int i = 0; i <= MAX; i++) {
        CountDistinct[i] = 0;
        prime[i] = true;
    }
 
    // Seive of Eratosthenes
    for (long long int i = 2; i <= MAX; i++) {
 
        if (prime[i] == true) {
            CountDistinct[i] = 1;
 
            for (long long int j = i * 2; j <= MAX;
                 j += i) {
 
                CountDistinct[j]++;
                prime[j] = false;
            }
        }
    }
}
 
// Function to count pairs with even
// product of distinct prime factors
int CountEvenPair(int A[], int B[], int N, int M)
{
    // Stores count of
    // distinct prime factors
    vector countDistinct(MAX + 1);
 
    countOfPrimefactors(countDistinct);
 
    // Stores the count of numbers
    // with even prime factors in B[]
    int evenCount = 0;
 
    // Stores the count of numbers
    // with odd prime factors in B[]
    int oddCount = 0;
 
    // Even Product Pairs
    int evenPairs = 0;
 
    // Traverse the array B[]
    for (int i = 0; i < M; i++) {
 
        // Since, product has to be
        // positive i.e > 0
 
        if (countDistinct[B[i]] == 0)
            continue;
 
        // If count of prime factors is odd
        if (countDistinct[B[i]] & 1) {
 
            // Increment oddCount by 1
            oddCount++;
        }
        else {
 
            // Increment evenCount by 1
            evenCount++;
        }
    }
 
    for (int i = 0; i < N; i++) {
 
        // Since, product has to be
        // positive i.e > 0
 
        if (countDistinct[A[i]] == 0)
            continue;
 
        // If count of prime factors is odd
        if (countDistinct[A[i]] & 1) {
 
            // odd * even = even
            evenPairs += (evenCount);
        }
 
        // If count of prime factors is even
        else {
 
            // even * odd = even
            // even * even = even
            evenPairs += evenCount + oddCount;
        }
    }
 
    return evenPairs;
}
 
// Driver Code
int main()
{
    int A[] = { 1, 2, 3 };
    int B[] = { 4, 5, 6 };
 
    int N = sizeof(A) / sizeof(A[0]);
    int M = sizeof(B) / sizeof(B[0]);
 
    cout << CountEvenPair(A, B, N, M);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG
{
 
  static int MAX = 1000000;
 
  // Function to calculate count of
  // distinct prime factors of a number
  static void countOfPrimefactors(int[] CountDistinct)
  {
    boolean[]  prime = new boolean[MAX + 1];
 
    for (int i = 0; i <= MAX; i++) {
      CountDistinct[i] = 0;
      prime[i] = true;
    }
 
    // Seive of Eratosthenes
    for (int i = 2; i <= MAX; i++) {
 
      if (prime[i] == true) {
        CountDistinct[i] = 1;
 
        for (int j = i * 2; j <= MAX;
             j += i) {
 
          CountDistinct[j]++;
          prime[j] = false;
        }
      }
    }
  }
 
  // Function to count pairs with even
  // product of distinct prime factors
  static int CountEvenPair(int A[], int B[], int N, int M)
  {
    // Stores count of
    // distinct prime factors
    int[] countDistinct = new int[(MAX + 1)];
 
    countOfPrimefactors(countDistinct);
 
    // Stores the count of numbers
    // with even prime factors in B[]
    int evenCount = 0;
 
    // Stores the count of numbers
    // with odd prime factors in B[]
    int oddCount = 0;
 
    // Even Product Pairs
    int evenPairs = 0;
 
    // Traverse the array B[]
    for (int i = 0; i < M; i++) {
 
      // Since, product has to be
      // positive i.e > 0
 
      if (countDistinct[B[i]] == 0)
        continue;
 
      // If count of prime factors is odd
      if ((countDistinct[B[i]] & 1) != 0) {
 
        // Increment oddCount by 1
        oddCount++;
      }
      else {
 
        // Increment evenCount by 1
        evenCount++;
      }
    }
 
    for (int i = 0; i < N; i++) {
 
      // Since, product has to be
      // positive i.e > 0
 
      if (countDistinct[A[i]] == 0)
        continue;
 
      // If count of prime factors is odd
      if ((countDistinct[A[i]] & 1) != 0) {
 
        // odd * even = even
        evenPairs += (evenCount);
      }
 
      // If count of prime factors is even
      else {
 
        // even * odd = even
        // even * even = even
        evenPairs += evenCount + oddCount;
      }
    }
    return evenPairs;
  }
 
 
  // Driver Code
  public static void main(String[] args)
  {
    int A[] = { 1, 2, 3 };
    int B[] = { 4, 5, 6 };
 
    int N = A.length;
    int M = B.length;
 
    System.out.println(CountEvenPair(A, B, N, M));
  }
}
 
// This code is contributed by sanjoy_62.


Python3
# Python 3 implementation of
# the above appraoch
MAX = 1000000
 
# Function to calculate count of
# distinct prime factors of a number
def countOfPrimefactors(CountDistinct):
    global MAX
    prime = [0 for i in range(MAX + 1)]
 
    for i in range(MAX+1):
        CountDistinct[i] = 0
        prime[i] = True
 
    # Seive of Eratosthenes
    for i in range(2,MAX+1,1):
        if (prime[i] == True):
            CountDistinct[i] = 1
 
            for j in range(i * 2,MAX+1,i):
                CountDistinct[j] += 1
                prime[j] = False
             
# Function to count pairs with even
# product of distinct prime factors
def CountEvenPair(A, B, N, M):
    global MAX
     
    # Stores count of
    # distinct prime factors
    countDistinct = [0 for i in range(MAX + 1)]
    countOfPrimefactors(countDistinct)
 
    # Stores the count of numbers
    # with even prime factors in B[]
    evenCount = 0
 
    # Stores the count of numbers
    # with odd prime factors in B[]
    oddCount = 0
 
    # Even Product Pairs
    evenPairs = 0
 
    # Traverse the array B[]
    for i in range(M):
       
        # Since, product has to be
        # positive i.e > 0
        if (countDistinct[B[i]] == 0):
            continue
 
        # If count of prime factors is odd
        if (countDistinct[B[i]] & 1):
           
            # Increment oddCount by 1
            oddCount += 1
         
        else:
            # Increment evenCount by 1
            evenCount += 1
 
    for i in range(N):
       
        # Since, product has to be
        # positive i.e > 0
 
        if (countDistinct[A[i]] == 0):
            continue
 
        # If count of prime factors is odd
        if (countDistinct[A[i]] & 1):
           
            # odd * even = even
            evenPairs += (evenCount)
 
        # If count of prime factors is even
        else:
            # even * odd = even
            # even * even = even
            evenPairs += evenCount + oddCount
 
    return evenPairs
 
# Driver Code
if __name__ == '__main__':
    A =  [1, 2, 3]
    B =  [4, 5, 6]
    N = len(A)
    M = len(B)
    print(CountEvenPair(A, B, N, M))
      
    # This code is contributed by SURENDRA_GANGWAR.


C#
// C# program for the above approach
using System;
public class GFG
{
 
  static int MAX = 1000000;
 
  // Function to calculate count of
  // distinct prime factors of a number
  static void countOfPrimefactors(int[] CountDistinct)
  {
    bool[]  prime = new bool[MAX + 1];
 
    for (int i = 0; i <= MAX; i++) {
      CountDistinct[i] = 0;
      prime[i] = true;
    }
 
    // Seive of Eratosthenes
    for (int i = 2; i <= MAX; i++) {
 
      if (prime[i] == true) {
        CountDistinct[i] = 1;
 
        for (int j = i * 2; j <= MAX;
             j += i) {
 
          CountDistinct[j]++;
          prime[j] = false;
        }
      }
    }
  }
 
  // Function to count pairs with even
  // product of distinct prime factors
  static int CountEvenPair(int []A, int []B, int N, int M)
  {
     
    // Stores count of
    // distinct prime factors
    int[] countDistinct = new int[(MAX + 1)];
    countOfPrimefactors(countDistinct);
 
    // Stores the count of numbers
    // with even prime factors in B[]
    int evenCount = 0;
 
    // Stores the count of numbers
    // with odd prime factors in B[]
    int oddCount = 0;
 
    // Even Product Pairs
    int evenPairs = 0;
 
    // Traverse the array B[]
    for (int i = 0; i < M; i++) {
 
      // Since, product has to be
      // positive i.e > 0
      if (countDistinct[B[i]] == 0)
        continue;
 
      // If count of prime factors is odd
      if ((countDistinct[B[i]] & 1) != 0) {
 
        // Increment oddCount by 1
        oddCount++;
      }
      else {
 
        // Increment evenCount by 1
        evenCount++;
      }
    }
 
    for (int i = 0; i < N; i++) {
 
      // Since, product has to be
      // positive i.e > 0
 
      if (countDistinct[A[i]] == 0)
        continue;
 
      // If count of prime factors is odd
      if ((countDistinct[A[i]] & 1) != 0) {
 
        // odd * even = even
        evenPairs += (evenCount);
      }
 
      // If count of prime factors is even
      else {
 
        // even * odd = even
        // even * even = even
        evenPairs += evenCount + oddCount;
      }
    }
    return evenPairs;
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int []A = { 1, 2, 3 };
    int []B = { 4, 5, 6 };
 
    int N = A.Length;
    int M = B.Length;
 
    Console.WriteLine(CountEvenPair(A, B, N, M));
  }
}
 
// This code is contributed by AnkThon


输出:
2

时间复杂度: O(N * log(N))
辅助空间: O(N)