Dado un gran número N, la tarea es encontrar el número total de factores del número N módulo M donde M es cualquier número primo.
Ejemplos:
Entrada: N = 9699690, M = 17
Salida: 1
Explicación:
Número total de factores de 9699690 es 256 y (256 % 17) = 1
Entrada: N = 193748576239475639, M = 9
Salida: 8
Explicación:
Número total de factores de 9699690 es 256 y (256 % 17) = 1
Recomendado: pruebe su enfoque en {IDE} primero, antes de pasar a la solución.
Definición de Factores de un número:
En matemáticas, un factor de un número entero N, también llamado divisor de N, es un número entero M que se puede multiplicar por algún número entero para producir N.
Cualquier número se puede escribir como:
N = (P1 A1 ) * (P2 A2 ) * (P3 A3 ) …. ( PnAn )
donde P1, P2, P3…Pn son primos distintos y A1, A2, A3…An son el número de veces que aparece el número primo correspondiente.
La fórmula general del número total de factores de un número dado será:
Factores = (1+A1) * (1+A2) * (1+A3) * … (1+An)
donde A1, A2, A3, … An son recuentos de distintos factores primos de N.
Aquí , la implementación de Sieve para encontrar la descomposición en factores primos de un número grande no se puede usar porque requiere un espacio proporcional.
Acercarse:
- Cuente el número de veces que 2 es el factor del número dado N.
- Iterar de 3 a √(N) para encontrar el número de veces que un número primo divide a un número particular que se reduce cada vez por N / i .
- Divida el número N por su factor primo más pequeño correspondiente hasta que N se convierta en 1 .
- Encuentra el número de factores del número usando la fórmula
Factores = (1+A1) * (1+A2) * (1+A3) * … (1+An)
A continuación se muestra la implementación del enfoque anterior.
C++
// C++ implementation to find the // Number of factors of very // large number N modulo M #include <bits/stdc++.h> using namespace std; #define ll long long ll mod = 1000000007; // Function for modular // multiplication ll mult(ll a, ll b) { return ((a % mod) * (b % mod)) % mod; } // Function to find the number // of factors of large Number N ll calculate_factors(ll n) { ll ans, cnt; cnt = 0; ans = 1; // Count the number of times // 2 divides the number N while (n % 2 == 0) { cnt++; n = n / 2; } // Condition to check // if 2 divides it if (cnt) { ans = mult(ans, (cnt + 1)); } // Check for all the possible // numbers that can divide it for (int i = 3; i <= sqrt(n); i += 2) { cnt = 0; // Loop to check the number // of times prime number // i divides it while (n % i == 0) { cnt++; n = n / i; } // Condition to check if // prime number i divides it if (cnt) { ans = mult(ans, (cnt + 1)); } } // Condition to check if N // at the end is a prime number. if (n > 2) { ans = mult(ans, (2)); } return ans % mod; } // Driver Code int main() { ll n = 193748576239475639; mod = 17; cout << calculate_factors(n) << endl; return 0; }
Java
// Java implementation to find the // Number of factors of very // large number N modulo M class GFG{ static long mod = 1000000007L; // Function for modular // multiplication static long mult(long a, long b) { return ((a % mod) * (b % mod)) % mod; } // Function to find the number // of factors of large Number N static long calculate_factors(long n) { long ans, cnt; cnt = 0; ans = 1; // Count the number of times // 2 divides the number N while (n % 2 == 0) { cnt++; n = n / 2; } // Condition to check // if 2 divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } // Check for all the possible // numbers that can divide it for (int i = 3; i <= Math.sqrt(n); i += 2) { cnt = 0; // Loop to check the number // of times prime number // i divides it while (n % i == 0) { cnt++; n = n / i; } // Condition to check if // prime number i divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } } // Condition to check if N // at the end is a prime number. if (n > 2) { ans = mult(ans, (2)); } return ans % mod; } // Driver Code public static void main(String[] args) { long n = 193748576239475639L; mod = 17; System.out.print(calculate_factors(n) +"\n"); } } // This code is contributed by sapnasingh4991
Python 3
# Python 3 implementation to find the # Number of factors of very # large number N modulo M from math import sqrt mod = 1000000007 # Function for modular # multiplication def mult(a, b): return ((a % mod) * (b % mod)) % mod # Function to find the number # of factors of large Number N def calculate_factors(n): cnt = 0 ans = 1 # Count the number of times # 2 divides the number N while (n % 2 == 0): cnt += 1 n = n // 2 # Condition to check # if 2 divides it if (cnt): ans = mult(ans, (cnt + 1)) # Check for all the possible # numbers that can divide it for i in range(3, int(sqrt(n)), 2): cnt = 0 # Loop to check the number # of times prime number # i divides it while (n % i == 0): cnt += 1 n = n // i # Condition to check if # prime number i divides it if (cnt): ans = mult(ans, (cnt + 1)) # Condition to check if N # at the end is a prime number. if (n > 2): ans = mult(ans, 2) return ans % mod # Driver Code if __name__ == '__main__': n = 19374857 mod = 17 print(calculate_factors(n)) # This code is contributed by Surendra_Gangwar
C#
// C# implementation to find the // Number of factors of very // large number N modulo M using System; class GFG{ static long mod = 1000000007L; // Function for modular // multiplication static long mult(long a, long b) { return ((a % mod) * (b % mod)) % mod; } // Function to find the number // of factors of large Number N static long calculate_factors(long n) { long ans, cnt; cnt = 0; ans = 1; // Count the number of times // 2 divides the number N while (n % 2 == 0) { cnt++; n = n / 2; } // Condition to check // if 2 divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } // Check for all the possible // numbers that can divide it for (int i = 3; i <= Math.Sqrt(n); i += 2) { cnt = 0; // Loop to check the number // of times prime number // i divides it while (n % i == 0) { cnt++; n = n / i; } // Condition to check if // prime number i divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } } // Condition to check if N // at the end is a prime number. if (n > 2) { ans = mult(ans, (2)); } return ans % mod; } // Driver Code public static void Main(String[] args) { long n = 193748576239475639L; mod = 17; Console.Write(calculate_factors(n) +"\n"); } } // This code is contributed by sapnasingh4991
Javascript
<script> // javascript implementation to find the // Number of factors of very // large number N modulo M mod = 1000000007; // Function for modular // multiplication function mult( a , b) { return ((a % mod) * (b % mod)) % mod; } // Function to find the number // of factors of large Number N function calculate_factors( n) { var ans, cnt; cnt = 0; ans = 1; // Count the number of times // 2 divides the number N while (n % 2 == 0) { cnt++; n = n / 2; } // Condition to check // if 2 divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } // Check for all the possible // numbers that can divide it for (i = 3; i <= Math.sqrt(n); i += 2) { cnt = 0; // Loop to check the number // of times prime number // i divides it while (n % i == 0) { cnt++; n = n / i; } // Condition to check if // prime number i divides it if (cnt % 2 == 1) { ans = mult(ans, (cnt + 1)); } } // Condition to check if N // at the end is a prime number. if (n > 2) { ans = mult(ans, (2)); } return ans % mod; } // Driver Code var n = 193748576239475639; mod = 17; document.write(calculate_factors(n)); // This code contributed by shikhasingrajput </script>
8
Complejidad de tiempo: O(sqrt(N))
Espacio auxiliar : O(1)