Número de factores de un número muy grande N módulo M donde M es cualquier número primo

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:
Explicación: 
Número total de factores de 9699690 es 256 y (256 % 17) = 1
Entrada: N = 193748576239475639, M = 9 
Salida:
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: 
 

  1. Cuente el número de veces que 2 es el factor del número dado N.
  2. 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 .
  3. Divida el número N por su factor primo más pequeño correspondiente hasta que N se convierta en 1 .
  4. 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>
Producción: 

8

 

Complejidad de tiempo: O(sqrt(N))
Espacio auxiliar : O(1) 

Publicación traducida automáticamente

Artículo escrito por Subash23 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *