给定一个长度为N的数组arr[]和一个正整数M ,任务是找到所有与M模逆存在的数组元素的按位异或。
例子:
Input: arr[] = {1, 2, 3}, M = 4
Output: 2
Explanation:
Initialize the value xor with 0:
For element indexed at 0 i.e., 1, its mod inverse with 4 is 1 because (1 * 1) % 4 = 1 i.e., it exists. Therefore, xor = (xor ^ 1) = 1.
For element indexed at 1 i.e., 2, its mod inverse does not exist.
For element indexed at 2 i.e., 3, its mod inverse with 4 is 3 because (3 * 3) % 4 = 1 i.e., it exists. Therefore, xor = (xor ^ 3) = 2.
Hence, xor is 2.
Input: arr[] = {3, 6, 4, 5, 8}, M = 9
Output: 9
Explanation:
Initialize the value xor with 0:
For element indexed at 0 i.e., 3, its mod inverse does not exist.
For element indexed at 1 i.e., 6, its mod inverse does not exist.
For element indexed at 2 i.e., 4, its mod inverse with 9 is 7 because (4 * 7) % 9 = 1 i.e., it exists. Therefore, xor = (xor ^ 4) = 4.
For element indexed at 3 i.e., 5, its mod inverse with 9 is 2 because (5 * 2) % 9 = 1 i.e., it exists. Therefore, xor = (xor ^ 5) = 1.
For element indexed at 4 i.e., 8, its mod inverse with 9 is 8 because (8 * 8) % 9 = 1 i.e., it exists. Therefore, xor = (xor ^ 8) = 9.
Hence, xor is 9.
朴素的方法:最简单的方法是打印数组中存在任何j的所有元素的异或,其中(1 <= j < M)使得(arr[i] * j) % M = 1 where 0 ≤我 < N 。
时间复杂度: O(N * M)
辅助空间: O(N)
高效方法:为了优化上述方法,这个想法是使用属性,任何数量的X的下模M中的模逆存在当且仅当M和X的GCD是1即满足gcd(M,X)是1 .请按照以下步骤解决问题:
- 用0初始化一个变量xor ,以存储M下存在模逆的所有元素的异或。
- 在[0, N – 1]范围内遍历数组。
- 如果 GCD(M,ARR [I])为1,则更新XOR为异或=(XOR ^ ARR [I])。
- 遍历后,将值xor打印为所需的结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to return the gcd of a & b
int gcd(int a, int b)
{
// Base Case
if (a == 0)
return b;
// Recursively calculate GCD
return gcd(b % a, a);
}
// Function to print the Bitwise XOR of
// elements of arr[] if gcd(arr[i], M) is 1
void countInverse(int arr[], int N, int M)
{
// Initialize xor
int XOR = 0;
// Traversing the array
for (int i = 0; i < N; i++) {
// GCD of M and arr[i]
int gcdOfMandelement
= gcd(M, arr[i]);
// If GCD is 1, update xor
if (gcdOfMandelement == 1) {
XOR ^= arr[i];
}
}
// Print xor
cout << XOR << ' ';
}
// Drive Code
int main()
{
// Given array arr[]
int arr[] = { 1, 2, 3 };
// Given number M
int M = 4;
// Size of the array
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
countInverse(arr, N, M);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG{
// Function to return the gcd of a & b
static int gcd(int a, int b)
{
// Base Case
if (a == 0)
return b;
// Recursively calculate GCD
return gcd(b % a, a);
}
// Function to print the Bitwise XOR of
// elements of arr[] if gcd(arr[i], M) is 1
static void countInverse(int[] arr, int N, int M)
{
// Initialize xor
int XOR = 0;
// Traversing the array
for(int i = 0; i < N; i++)
{
// GCD of M and arr[i]
int gcdOfMandelement = gcd(M, arr[i]);
// If GCD is 1, update xor
if (gcdOfMandelement == 1)
{
XOR ^= arr[i];
}
}
// Print xor
System.out.println(XOR);
}
// Drive Code
public static void main(String[] args)
{
// Given array arr[]
int[] arr = { 1, 2, 3 };
// Given number M
int M = 4;
// Size of the array
int N = arr.length;
// Function Call
countInverse(arr, N, M);
}
}
// This code is contributed by akhilsaini
Python3
# Python3 program for the above approach
# Function to return the gcd of a & b
def gcd(a, b):
# Base Case
if (a == 0):
return b
# Recursively calculate GCD
return gcd(b % a, a)
# Function to print the Bitwise XOR of
# elements of arr[] if gcd(arr[i], M) is 1
def countInverse(arr, N, M):
# Initialize xor
XOR = 0
# Traversing the array
for i in range(0, N):
# GCD of M and arr[i]
gcdOfMandelement = gcd(M, arr[i])
# If GCD is 1, update xor
if (gcdOfMandelement == 1):
XOR = XOR ^ arr[i]
# Print xor
print(XOR)
# Drive Code
if __name__ == '__main__':
# Given array arr[]
arr = [ 1, 2, 3 ]
# Given number M
M = 4
# Size of the array
N = len(arr)
# Function Call
countInverse(arr, N, M)
# This code is contributed by akhilsaini
C#
// C# program for the above approach
using System;
class GFG{
// Function to return the gcd of a & b
static int gcd(int a, int b)
{
// Base Case
if (a == 0)
return b;
// Recursively calculate GCD
return gcd(b % a, a);
}
// Function to print the Bitwise XOR of
// elements of arr[] if gcd(arr[i], M) is 1
static void countInverse(int[] arr, int N, int M)
{
// Initialize xor
int XOR = 0;
// Traversing the array
for(int i = 0; i < N; i++)
{
// GCD of M and arr[i]
int gcdOfMandelement = gcd(M, arr[i]);
// If GCD is 1, update xor
if (gcdOfMandelement == 1)
{
XOR ^= arr[i];
}
}
// Print xor
Console.WriteLine(XOR);
}
// Drive Code
public static void Main()
{
// Given array arr[]
int[] arr = { 1, 2, 3 };
// Given number M
int M = 4;
// Size of the array
int N = arr.Length;
// Function Call
countInverse(arr, N, M);
}
}
// This code is contributed by akhilsaini
Javascript
2
时间复杂度: O(N*log M)
辅助空间: O(N)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live