Dada una array arr[] de tamaño N y un número primo P , la tarea es contar los elementos de la array de modo que el inverso multiplicativo módulo del elemento bajo el módulo P sea igual al elemento mismo.
Ejemplos:
Entrada: arr[] = {1, 6, 4, 5}, P = 7
Salida: 2
Explicación:
El inverso multiplicativo modular de arr[0](=1) bajo módulo P(= 7) es arr[0](= 1) en sí mismo.
El inverso multiplicativo modular de arr1](= 6) bajo módulo P(= 7) es arr[1](= 6) mismo.
Por lo tanto, la salida requerida es 2.Entrada: arr[] = {1, 3, 8, 12, 12}, P = 13
Salida: 3
Enfoque ingenuo: el enfoque más simple para resolver este problema es atravesar la array e imprimir el recuento de elementos de la array de manera que el inverso multiplicativo del módulo del elemento bajo el módulo P sea igual al elemento mismo.
Complejidad de Tiempo: O(N * log P)
Espacio Auxiliar: O(1)
Enfoque eficiente: Para optimizar el enfoque anterior, la idea se basa en las siguientes observaciones:
Si X e Y son dos números tales que (X × Y) % P = 1 , entonces Y es módulo inverso de X.
Por lo tanto, si Y es el mismo X , entonces (X × X) % P debe ser 1.
Siga los pasos a continuación para resolver el problema:
- Inicialice una variable, digamos cntElem para almacenar el recuento de elementos que satisfacen la condición dada.
- Recorra la array dada y verifique si (arr[i] * arr[i]) % P es igual a 1 o no. Si se determina que es cierto, incremente el recuento de cntElem en 1 .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to get the count // of elements that satisfy // the given condition. int equvInverse(int arr[], int N, int P) { // Stores count of elements // that satisfy the condition int cntElem = 0; // Traverse the given array. for (int i = 0; i < N; i++) { // If square of current // element is equal to 1 if ((arr[i] * arr[i]) % P == 1) { cntElem++; } } return cntElem; } // Driver Code int main() { int arr[] = { 1, 6, 4, 5 }; int N = sizeof(arr) / sizeof(arr[0]); int P = 7; cout << equvInverse(arr, N, P); }
Java
// Java program to implement // the above approach import java.io.*; class GFG{ // Function to get the count // of elements that satisfy // the given condition. static int equvInverse(int[] arr, int N, int P) { // Stores count of elements // that satisfy the condition int cntElem = 0; // Traverse the given array. for(int i = 0; i < N; i++) { // If square of current // element is equal to 1 if ((arr[i] * arr[i]) % P == 1) { cntElem++; } } return cntElem; } // Driver Code public static void main(String[] args) { int[] arr = { 1, 6, 4, 5 }; int N = arr.length; int P = 7; System.out.println(equvInverse(arr, N, P)); } } // This code is contributed by akhilsaini
Python3
# Python3 program to implement # the above approach # Function to get the count # of elements that satisfy # the given condition. def equvInverse(arr, N, P): # Stores count of elements # that satisfy the condition cntElem = 0 # Traverse the given array. for i in range(0, N): # If square of current # element is equal to 1 if ((arr[i] * arr[i]) % P == 1): cntElem = cntElem + 1 return cntElem # Driver Code if __name__ == "__main__": arr = [ 1, 6, 4, 5 ] N = len(arr) P = 7 print(equvInverse(arr, N, P)) # This code is contributed by akhilsaini
C#
// C# program to implement // the above approach using System; class GFG{ // Function to get the count // of elements that satisfy // the given condition. static int equvInverse(int[] arr, int N, int P) { // Stores count of elements // that satisfy the condition int cntElem = 0; // Traverse the given array. for(int i = 0; i < N; i++) { // If square of current // element is equal to 1 if ((arr[i] * arr[i]) % P == 1) { cntElem++; } } return cntElem; } // Driver Code public static void Main() { int[] arr = { 1, 6, 4, 5 }; int N = arr.Length; int P = 7; Console.WriteLine(equvInverse(arr, N, P)); } } // This code is contributed by akhilsaini
Javascript
<script> // Javascript program to implement // the above approach // Function to get the count // of elements that satisfy // the given condition. function equvInverse(arr, N, P) { // Stores count of elements // that satisfy the condition let cntElem = 0; // Traverse the given array. for (let i = 0; i < N; i++) { // If square of current // element is equal to 1 if ((arr[i] * arr[i]) % P == 1) { cntElem++; } } return cntElem; } // Driver Code let arr = [ 1, 6, 4, 5 ]; let N = arr.length; let P = 7; document.write(equvInverse(arr, N, P)); // This code is contributed by subham348. </script>
2
Complejidad temporal: O(N)
Espacio auxiliar: O(1)