给定两个数字{N,M}的成对arr []的数组,任务是找到每对N和M的公共除数的最大数量,以使公共除数之间的每对都是互质的。
A number x is a common divisor of N and M if, N%x = 0 and M%x = 0.
Two numbers are co-prime if their Greatest Common Divisor is 1.
例子:
Input: arr[][] = {{12, 18}, {420, 660}}
Output: 3 4
Explanation:
For pair (12, 18):
{1, 2, 3} are common divisors of both 12 and 18, and are pairwise co-prime.
For pair (420, 660):
{1, 2, 3, 5} are common divisors of both 12 and 18, and are pairwise co-prime.
Input: arr[][] = {{8, 18}, {20, 66}}
Output: 2 2
方法:N和M的公约数的最大计数,使得它们之间的所有对的GCD总是1是1和N和M所有常见的素因子。要计算所有常见的素数除数,想法是找到给定两个数的GCD(例如G ),然后计算数G的素数除数。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the gcd of
// two numbers
int gcd(int x, int y)
{
if (x % y == 0)
return y;
else
return gcd(y, x % y);
}
// Function to of pairwise co-prime
// and common divisors of two numbers
int countPairwiseCoprime(int N, int M)
{
// Initialize answer with 1,
// to include 1 in the count
int answer = 1;
// Count of primes of gcd(N, M)
int g = gcd(N, M);
int temp = g;
// Finding prime factors of gcd
for (int i = 2; i * i <= g; i++) {
// Increment count if it is
// divisible by i
if (temp % i == 0) {
answer++;
while (temp % i == 0)
temp /= i;
}
}
if (temp != 1)
answer++;
// Return the total count
return answer;
}
void countCoprimePair(int arr[][2], int N)
{
// Function Call for each pair
// to calculate the count of
// pairwise co-prime divisors
for (int i = 0; i < N; i++) {
cout << countPairwiseCoprime(arr[i][0],
arr[i][1])
<< ' ';
}
}
// Driver Code
int main()
{
// Given array of pairs
int arr[][2] = { { 12, 18 }, { 420, 660 } };
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
countCoprimePair(arr, N);
return 0;
}
Java
// Java program for the above approach
class GFG{
// Function to find the gcd of
// two numbers
static int gcd(int x, int y)
{
if (x % y == 0)
return y;
else
return gcd(y, x % y);
}
// Function to of pairwise co-prime
// and common divisors of two numbers
static int countPairwiseCoprime(int N, int M)
{
// Initialize answer with 1,
// to include 1 in the count
int answer = 1;
// Count of primes of gcd(N, M)
int g = gcd(N, M);
int temp = g;
// Finding prime factors of gcd
for (int i = 2; i * i <= g; i++)
{
// Increment count if it is
// divisible by i
if (temp % i == 0)
{
answer++;
while (temp % i == 0)
temp /= i;
}
}
if (temp != 1)
answer++;
// Return the total count
return answer;
}
static void countCoprimePair(int arr[][], int N)
{
// Function Call for each pair
// to calculate the count of
// pairwise co-prime divisors
for (int i = 0; i < N; i++)
{
System.out.print(countPairwiseCoprime(arr[i][0],
arr[i][1]) + " ");
}
}
// Driver Code
public static void main(String[] args)
{
// Given array of pairs
int arr[][] = { { 12, 18 }, { 420, 660 } };
int N = arr.length;
// Function Call
countCoprimePair(arr, N);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program for the above approach
# Function to find the gcd of
# two numbers
def gcd(x, y):
if (x % y == 0):
return y
else:
return gcd(y, x % y)
# Function to of pairwise co-prime
# and common divisors of two numbers
def countPairwiseCoprime(N, M):
# Initialize answer with 1,
# to include 1 in the count
answer = 1
# Count of primes of gcd(N, M)
g = gcd(N, M)
temp = g
# Finding prime factors of gcd
for i in range(2, g + 1):
if i * i > g:
break
# Increment count if it is
# divisible by i
if (temp % i == 0) :
answer += 1
while (temp % i == 0):
temp //= i
if (temp != 1):
answer += 1
# Return the total count
return answer
def countCoprimePair(arr, N):
# Function Call for each pair
# to calculate the count of
# pairwise co-prime divisors
for i in range(N):
print(countPairwiseCoprime(arr[i][0],
arr[i][1]),
end = " ")
# Driver Code
if __name__ == '__main__':
# Given array of pairs
arr= [ [ 12, 18 ], [ 420, 660 ] ]
N = len(arr)
# Function Call
countCoprimePair(arr, N)
# This code is contributed by Mohit Kumar
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the gcd of
// two numbers
static int gcd(int x, int y)
{
if (x % y == 0)
return y;
else
return gcd(y, x % y);
}
// Function to of pairwise co-prime
// and common divisors of two numbers
static int countPairwiseCoprime(int N, int M)
{
// Initialize answer with 1,
// to include 1 in the count
int answer = 1;
// Count of primes of gcd(N, M)
int g = gcd(N, M);
int temp = g;
// Finding prime factors of gcd
for (int i = 2; i * i <= g; i++)
{
// Increment count if it is
// divisible by i
if (temp % i == 0)
{
answer++;
while (temp % i == 0)
temp /= i;
}
}
if (temp != 1)
answer++;
// Return the total count
return answer;
}
static void countCoprimePair(int [,]arr, int N)
{
// Function Call for each pair
// to calculate the count of
// pairwise co-prime divisors
for (int i = 0; i < N; i++)
{
Console.Write(countPairwiseCoprime(arr[i, 0],
arr[i, 1]) + " ");
}
}
// Driver Code
public static void Main(String[] args)
{
// Given array of pairs
int [,]arr = { { 12, 18 }, { 420, 660 } };
int N = arr.GetLength(0);
// Function Call
countCoprimePair(arr, N);
}
}
// This code is contributed by Rajput-Ji
3 4
时间复杂度: O(X *(sqrt(N)+ sqrt(M))),其中X是arr []中的对数,N&M是两对。
辅助空间: O(1)