#include<bits/stdc++.h>
#define ll unsigned long long int
#define N 1000009
using namespace std;
int base[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
int p[N+10];
vector<long int>v;
void prime()
{
int l = sqrt(N);
p[0] = p[1] = 1;
v.push_back(2);
for(int i=4; i<N; i+=2)
p[i] = 1;
for(int i=3; i<N; i+=2)
{
if(p[i] == 0)
{
v.push_back(i);
if(i<=l)
{
for(int j=i*i; j<N; j+=i*2)
p[j] = 1;
}
}
}
}
ll mod(ll a, ll b, ll m)
{
ll r = 0;
a = a%m;
while(b > 0)
{
if(b&1)
r = (r + a)%m;
b = (b >> 1);
a = (a + a)%m;
}
return r;
}
ll power(ll a, ll d, ll n)
{
ll r = 1;
a = a%n;
while(d > 0)
{
if(d&1)
r = mod(r, a, n);
d = (d >> 1);
a = mod(a, a, n);
}
return r;
}
bool miller_rabin(ll n)
{
ll d = n-1;
for(int i=0; i<12; i++)
{
if(base[i] == n)
return true;
if(power(base[i], d, n) != 1)
return false;
}
return true;
}
ll countdivisors(ll n)
{
if(n == 1)
return 1;
ll ans = 1;
for(int i=0; i < v.size(); i++)
{
if((v[i] * v[i] * v[i]) > n)
break;
int cnt = 1;
while(n%v[i] == 0)
{
n = n/v[i];
cnt++;
}
ans = ans * cnt;
}
ll s = sqrt(n);
int t = 0;
if((s * s == n) && s > N && (s & 1))
{
if(miller_rabin(s))
t = 1;
}
else if((s * s == n) && s < N && (s & 1))
{
if(p[s] == 0)
t = 1;
}
if(n < N && p[n] == 0)
ans = ans * 2;
else if(n > N && miller_rabin(n) == true)
ans = ans * 2;
else if(t == 1)
ans = ans * 3;
else if(n != 1)
ans = ans * 4;
return ans;
}
int main()
{
prime();
ll n;
cout << "Enter Any Number :: ";
cin >> n;
cout << "\nDivisors Numbers Are :: " << countdivisors(n) << "\n";
return 0;
}
Comments
Post a Comment