2020-04-15 05:30:23 +08:00
|
|
|
/// C++ Program to calculate number of divisors.
|
|
|
|
|
|
|
|
#include<iostream>
|
|
|
|
#include<vector>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This algorithm use the prime factorization approach.
|
|
|
|
* Any number can be written in multiplication of its prime factors.
|
|
|
|
* Let N = P1^E1 * P2^E2 ... Pk^Ek
|
|
|
|
* Therefore. number-of-divisors(N) = (E1+1) * (E2+1) ... (Ek+1).
|
|
|
|
* Where P1, P2 ... Pk are prime factors and E1, E2 ... Ek are exponents respectively.
|
|
|
|
*
|
|
|
|
* Example:- N=36
|
|
|
|
* 36 = (3^2 * 2^2)
|
2020-04-15 05:38:49 +08:00
|
|
|
* number-of-divisors(36) = (2+1) * (2+1) = 9.
|
2020-04-15 05:30:23 +08:00
|
|
|
* list of divisors of 36 = 1, 2, 3, 4, 6, 9, 12, 18, 36.
|
|
|
|
**/
|
|
|
|
|
|
|
|
int number_of_divisors(int n) {
|
|
|
|
std::vector<int> prime_exponent_count;
|
|
|
|
for (int i=2; i*i <= n; i++) {
|
|
|
|
int prime_count = 0;
|
|
|
|
while (n % i == 0) {
|
|
|
|
prime_count += 1;
|
|
|
|
n /= i;
|
|
|
|
}
|
|
|
|
if (prime_count != 0) {
|
|
|
|
prime_exponent_count.push_back(prime_count);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int divisors_count = 1;
|
|
|
|
// If n is prime at that time vector prime_exponent_count will remain empty.
|
2020-04-15 05:38:49 +08:00
|
|
|
for (int i=0; i < prime_exponent_count.size(); i++) {
|
2020-04-15 05:30:23 +08:00
|
|
|
divisors_count = divisors_count * (prime_exponent_count[i]+1);
|
|
|
|
}
|
2020-04-15 05:38:49 +08:00
|
|
|
if (divisors_count == 1 && n != 1) {
|
2020-04-15 05:30:23 +08:00
|
|
|
// Prime number has exactly 2 divisors 1 and itself.
|
|
|
|
divisors_count = 2;
|
|
|
|
}
|
|
|
|
return divisors_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
int n;
|
|
|
|
std::cin >> n;
|
|
|
|
std::cout << number_of_divisors(n) << std::endl;
|
|
|
|
}
|