📌  相关文章
📜  检查是否所有元素都可以用 X 和 Y 除以相等

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

检查是否所有元素都可以用 X 和 Y 除以相等

给定一个数组arr[]和两个整数XY 。任务是检查是否可以通过将所有元素除以XY任意次数(包括 0)来使所有元素相等。

例子:

方法:从给定数组中找到所有元素的 gcd,因为这个 gcd 是我们可以通过将所有元素除以一些任意常数得到的值,例如gcd = arr[0] / k1 或 arr[1] / k2 或……或 arr[n-1] / kn 。现在的任务是找出这些常数k1, k2, k3, ..., kn是否具有X * X * X * ... * YYY * ... 的形式。 .如果是,那么可以使所有元素与给定的操作相等,否则它不是。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function that returns true if num
// is of the form x*x*x*...*y*y*...
bool isDivisible(int num, int x, int y)
{
 
    // While num divisible is divible
    // by either x or y, keep dividing
    while (num % x == 0 || num % y == 0) {
        if (num % x == 0)
            num /= x;
        if (num % y == 0)
            num /= y;
    }
 
    // If num > 1, it means it cannot be
    // further divided by either x or y
    if (num > 1)
        return false;
 
    return true;
}
 
// Function that returns true if all
// the array elements can be made
// equal with the given operation
bool isPossible(int arr[], int n, int x, int y)
{
 
    // To store the gcd of the array elements
    int gcd = arr[0];
    for (int i = 1; i < n; i++)
        gcd = __gcd(gcd, arr[i]);
 
    // For every element of the array
    for (int i = 0; i < n; i++) {
 
        // Check if k is of the form x*x*..*y*y*...
        // where (gcd * k = arr[i])
        if (!isDivisible(arr[i] / gcd, x, y))
            return false;
    }
    return true;
}
 
// Driver code
int main()
{
    int arr[] = { 2, 4, 6, 8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 2, y = 3;
 
    if (isPossible(arr, n, x, y))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}


Java
// Java implementation of the approach
 
class GFG
{
 
    // Function that returns true if num
    // is of the form x*x*x*...*y*y*...
    public static boolean isDivisible(int num, int x, int y)
    {
 
        // While num divisible is divible
        // by either x or y, keep dividing
        while (num % x == 0 || num % y == 0)
        {
            if (num % x == 0)
                num /= x;
            if (num % y == 0)
                num /= y;
        }
 
        // If num > 1, it means it cannot be
        // further divided by either x or y
        if (num > 1)
            return false;
 
        return true;
    }
 
    // Function to calculate gcd of two numbers
    // using Euclid's algorithm
    public static int _gcd(int a, int b)
    {
        while (a != b)
        {
            if (a > b)
                a = a - b;
            else
                b = b - a;
        }
 
        return a;
    }
 
    // Function that returns true if all
    // the array elements can be made
    // equal with the given operation
    public static boolean isPossible(int[] arr, int n,
                                        int x, int y)
    {
         
        // To store the gcd of the array elements
        int gcd = arr[0];
        for (int i = 1; i < n; i++)
            gcd = _gcd(gcd, arr[i]);
 
        // For every element of the array
        for (int i = 0; i < n; i++)
        {
 
            // Check if k is of the form x*x*..*y*y*...
            // where (gcd * k = arr[i])
            if (!isDivisible(arr[i] / gcd, x, y))
                return false;
        }
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int[] arr = { 2, 4, 6, 8 };
        int n = arr.length;
        int x = 2, y = 3;
        if (isPossible(arr, n, x, y))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by
// sanjeev2552


Python3
# Python3 implementation of the approach
from math import gcd as __gcd
 
# Function that returns True if num
# is of the form x*x*x*...*y*y*...
def isDivisible(num, x, y):
 
    # While num divisible is divible
    # by either x or y, keep dividing
    while (num % x == 0 or num % y == 0):
        if (num % x == 0):
            num //= x
        if (num % y == 0):
            num //= y
 
    # If num > 1, it means it cannot be
    # further divided by either x or y
    if (num > 1):
        return False
 
    return True
 
# Function that returns True if all
# the array elements can be made
# equal with the given operation
def isPossible(arr, n, x, y):
 
    # To store the gcd of the array elements
    gcd = arr[0]
    for i in range(1,n):
        gcd = __gcd(gcd, arr[i])
 
    # For every element of the array
    for i in range(n):
 
        # Check if k is of the form x*x*..*y*y*...
        # where (gcd * k = arr[i])
        if (isDivisible(arr[i] // gcd, x, y) == False):
            return False
    return True
 
 
# Driver code
 
arr = [2, 4, 6, 8]
n = len(arr)
x = 2
y = 3
 
if (isPossible(arr, n, x, y) == True):
    print("Yes")
else:
    print("No")
     
# This code is contributed by mohit kumar 29


C#
// C# implementation of the approach
using System;
 
class GFG
{
 
    // Function that returns true if num
    // is of the form x*x*x*...*y*y*...
    public static bool isDivisible(int num, int x, int y)
    {
 
        // While num divisible is divible
        // by either x or y, keep dividing
        while (num % x == 0 || num % y == 0)
        {
            if (num % x == 0)
                num /= x;
            if (num % y == 0)
                num /= y;
        }
 
        // If num > 1, it means it cannot be
        // further divided by either x or y
        if (num > 1)
            return false;
 
        return true;
    }
 
    // Function to calculate gcd of two numbers
    // using Euclid's algorithm
    public static int _gcd(int a, int b)
    {
        while (a != b)
        {
            if (a > b)
                a = a - b;
            else
                b = b - a;
        }
 
        return a;
    }
 
    // Function that returns true if all
    // the array elements can be made
    // equal with the given operation
    public static bool isPossible(int[] arr, int n,
                                        int x, int y)
    {
         
        // To store the gcd of the array elements
        int gcd = arr[0];
        for (int i = 1; i < n; i++)
            gcd = _gcd(gcd, arr[i]);
 
        // For every element of the array
        for (int i = 0; i < n; i++)
        {
 
            // Check if k is of the form x*x*..*y*y*...
            // where (gcd * k = arr[i])
            if (!isDivisible(arr[i] / gcd, x, y))
                return false;
        }
        return true;
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 4, 6, 8 };
        int n = arr.Length;
        int x = 2, y = 3;
        if (isPossible(arr, n, x, y))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by
// anuj_67..


Javascript


输出:
Yes