Wednesday, 18 May 2011

294-Divisors

#include<stdio.h>
#include<math.h>
#define M 31650
bool prime[M];
int prm[M];
int genprime();
int countFactor(int);

int main()
{
    register long H,L,T,i,d,max,n;
    //freopen("in.txt","r",stdin);
    scanf("%ld",&T);
    genprime();
    while(T--)
    {
        scanf("%ld%ld",&L,&H);
        max=0;
        for(i=L;i<=H;i++)
        {
            d=countFactor(i);
            if(max<d)max=d,n=i;
        }
        printf("Between %ld and %ld, %ld has a maximum of %ld divisors.\n",L,H,n,max);
    }
    return 0;
}

int genprime()
{
    register unsigned long i,j,s=sqrt(M);
    for(i=2;i<M;i++)
        prime[i]=true;
    for(i=2;i<s;)
    {
        if(prime[i])
            for(j=i+i;j<M;j+=i)
                prime[j]=false;
        for(i++;!prime[i];i++);
    }
    j=0;
    for(i=2;i<M;i++)
        if(prime[i])prm[j++]=i;
    return 0;
}
int countFactor(int n)
{
    register int c,Factor=1,i;
    for(i=0;prm[i]<=sqrt(n);i++)
    {
        c=0;
        while(!(n%prm[i]))
        {
            c++;
            n=n/prm[i];
        }
        Factor=Factor*(c+1);
        if(n==1)break;
    }
    if(n!=1)Factor=Factor*2;
    return Factor;
}

No comments:

Post a Comment