Monday, October 28, 2019

SPOJ - NDIV - n-divisors

Idea: Find Out the number of divisors(NOD) using prime factorization.Use Seive for finding prime number upto sqrt(10^9).

Code First Then See Solution

Code: 

#include <bits/stdc++.h>

using namespace std;

#define mx 3200

int a[mx+10];
vector <int> v;

void seive()
{
   memset(a,0,sizeof(a));
   for(int i=2;i<=sqrt(mx);i++)
   {
       if(a[i]==0)
       {
           for(int j=i*i;j<=mx;j+=i)
            a[j]=1;
       }
   }
   v.push_back(2);
   for(int i=3;i<=mx;i+=2)
   {
       if(a[i]==0)
        v.push_back(i);
   }
}

int main()
{
    int a,b,n;
    seive();
    cin>>a>>b>>n;
    int res=0,sum;
    for(int i=a;i<=b;i++)
    {
        int temp=i;
        sum=1;
        for(int j=0;j<v.size()&&v[j]<=sqrt(temp);j++)
        {
            if(temp%v[j]==0)
            {
                int cnt=0;
                while(temp%v[j]==0)
                {
                    cnt++;
                    temp/=v[j];
                }
                sum*=(cnt+1);
            }
        }
        if(temp!=1)
        {
            sum*=2;
        }
        if(sum==n)
            res++;
    }
    cout<<res<<endl;
    return 0;

}

No comments:

Post a Comment