XOR of array elements whose modular inverse with a given number exists

Given an array arr[] of length N and a positive integer M, the task is to find the Bitwise XOR of all the array elements whose modular inverse with M exists.
Examples:
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.
Naive Approach: The simplest approach is to print the XOR of all the elements of the array for which there exists any j where (1 <= j < M) such that (arr[i] * j) % M = 1 where 0 ? i < N.
Time Complexity: O(N * M)
Auxiliary Space: O(N)
Efficient Approach: To optimize the above approach, the idea is to use the property that the modular inverse of any number X under mod M exists if and only if the GCD of M and X is 1 i.e., gcd(M, X) is 1. Follow the steps below to solve the problem:
- Initialize a variable xor with 0, to store the xor of all the elements whose modular inverse under M exists.
- Traverse the array over the range [0, N – 1].
- If gcd(M, arr[i]) is 1 then update xor as xor = (xor^arr[i]).
- After traversing, print the value xor as the required result.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;Â
// Function to return the gcd of a & bint 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 1void 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 Codeint 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 approachimport java.io.*;Â
class GFG{Â
// Function to return the gcd of a & bstatic 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 1static 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 Codepublic 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 & bdef 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 1def 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 Codeif __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 approachusing System;Â
class GFG{Â
// Function to return the gcd of a & bstatic 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 1static 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 Codepublic 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
<script>Â
// Javascript program for the above approachÂ
// Function to return the gcd of a & bfunction 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 1function countInverse(arr, N, M){         // Initialize xor    var XOR = 0;Â
    // Traversing the array    for(var i = 0; i < N; i++)     {                 // GCD of M and arr[i]        var gcdOfMandelement = gcd(M, arr[i]);Â
        // If GCD is 1, update xor        if (gcdOfMandelement == 1)         {            XOR ^= arr[i];        }    }Â
    // Print xor    document.write(XOR);}Â
// Driver CodeÂ
// Given array arr[]var arr = [ 1, 2, 3 ];Â
// Given number Mvar M = 4;Â
// Size of the arrayvar N = arr.length;Â
// Function CallcountInverse(arr, N, M);Â
// This code is contributed by KirtiÂ
</script> |
Â
Â
2
Â
Â
Time Complexity: O(N*log M)
Auxiliary Space: O(N)
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



