Given a large number N, the task is to find the total number of factors of the number N modulo M where M is any prime number. 
Examples: 
 
Input: N = 9699690, M = 17
Output: 1
Explanation:
Total Number of factors of 9699690 is 256 and (256 % 17) = 1
Input: N = 193748576239475639, M = 9
Output: 8
Explanation:
Total Number of factors of 9699690 is 256 and (256 % 17) = 1
Recommended: Please try your approach on {IDE} first, before moving on to the solution.
Definition of Factors of a number: 
In mathematics, a factor of an integer N also called a divisor of N, is an integer M that may be multiplied by some integer to produce N.
Any number can be written as: 
 
N = (P1A1) * (P2A2) * (P3A3) …. (PnAn)
 
where P1, P2, P3…Pn are distinct prime and A1, A2, A3…An are number of times the corresponding prime number occurs.
The general formula of total number of factors of a given number will be: 
 
Factors = (1+A1) * (1+A2) * (1+A3) * … (1+An)
 
where A1, A2, A3, … An are count of distinct prime factors of N.
Here Sieve’s implementation to find prime factorization of a large number cannot be used because it requires proportional space.
Approach: 
 
- Count the number of times 2 is the factor of the given number N.
 - Iterate from 3 to √(N) to find the number of times a prime number divides a particular number which reduces every time by N / i.
 - Divide number N by its corresponding smallest prime factor till N becomes 1.
 - Find the number of factors of the number by using the formula 
 
Factors = (1+A1) * (1+A2) * (1+A3) * … (1+An)
Below is the implementation of the above approach.
 
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 longll mod = 1000000007;// Function for modular// multiplicationll mult(ll a, ll b){    return ((a % mod) *         (b % mod)) % mod;}// Function to find the number// of factors of large Number Nll 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 Codeint 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 Mclass GFG{  static long  mod = 1000000007L;  // Function for modular// multiplicationstatic long  mult(long  a, long  b){    return ((a % mod) *         (b % mod)) % mod;}  // Function to find the number// of factors of large Number Nstatic 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 Codepublic 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 Mfrom math import sqrtmod = 1000000007# Function for modular# multiplicationdef mult(a, b):    return ((a % mod) * (b % mod)) % mod# Function to find the number# of factors of large Number Ndef 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 Codeif __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 Musing System;class GFG{   static long  mod = 1000000007L;   // Function for modular// multiplicationstatic long  mult(long  a, long  b){    return ((a % mod) *         (b % mod)) % mod;}   // Function to find the number// of factors of large Number Nstatic 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 Codepublic 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// multiplicationfunction  mult( a ,  b){    return ((a % mod) *         (b % mod)) % mod;}  // Function to find the number// of factors of large Number Nfunction  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 Codevar  n = 193748576239475639;mod = 17;document.write(calculate_factors(n));// This code contributed by shikhasingrajput </script> | 
8
Time Complexity: O(sqrt(N))
Auxiliary Space: O(1) 
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
