Cod sursa(job #1267706)

Utilizator hristacheruxiRuxandra Hristache hristacheruxi Data 20 noiembrie 2014 09:18:03
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#define MAX 1000001
#define MOD 9973

char ciur[1000001];
int v[78500];

void ciuruire()
{
    int d,m;
    ciur[0]=ciur[1]=1;
    d=2;
    while(d*d<=MAX)
    {
        for(m=2; m<=MAX/d; m++)
            ciur[m*d]=1;
        d++;
        while(ciur[d]==1)
            d++;
    }
}

int pow(int a, int n)
{
    int p;
    p=1;
    while(n>0)
    {
        if(n%2==1)
            p=p*a;
        a=a*a;
        n=n/2;
    }
    return p;
}

int main()
{
    freopen("ssnd.in" , "r" , stdin);
    freopen("ssnd.out" , "w" , stdout);
    int n,j,i,p,nrdiv=1,cnr,x,nr;
    long long sdiv=1;

    ciuruire();

    for(i=2,j=1; i<=MAX; i++)
    {
        if(ciur[i]==0)
        {
            v[j]=i;
            j++;
        }
    }

    scanf("%d" , &n);
    for(i=1; i<=n; i++)
    {
        scanf("%d" , &nr);
        cnr=nr;
        nrdiv=sdiv=1;

        if(ciur[nr]==0)
            printf("2 %d\n", nr+1);
        else
        {
            for(j=1; v[j]*v[j]<=nr; j++)
            {
                p=0;
                while(nr%v[j]==0)
                {
                    p++;
                    nr/=v[j];
                }

                if(p!=0)
                {
                    nrdiv=nrdiv*(p+1);

                    x=pow(v[j],(p+1));
                    x=x-1;
                    x=x/(v[j]-1);
                    sdiv=(sdiv*x)%MOD;
                }
            }

            if(nr>1)
            {
                nrdiv*=2;
                sdiv=sdiv*(v[j]*v[j]-1)/(v[j]-1)%MOD;
            }

            printf("%d %lld\n", nrdiv, sdiv);
        }
    }

    return 0;
}