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!
