Cod sursa(job #1245636)

Utilizator thewildnathNathan Wildenberg thewildnath Data 19 octombrie 2014 19:10:45
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#include<math.h>

#define NMAX 1000000
#define MOD 9973

int np, prime[78500];
bool c[NMAX+2];

void ciur()
{
    prime[++np]=2;

    for(int i=3; i<=NMAX; i+=2)
    {
        if(!c[i])
        {
            prime[++np]=i;

            if(i<=NMAX/i)
                for(int j=i*i; j<=NMAX; j+=2*i)
                    c[j]=true;
        }
    }
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    int n, num, exp, lim;
    long long x, sum, aux, put;

    ciur();

    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
    {
        num=sum=1;

        scanf("%d", &x);

        lim=sqrt(x);

        for(int j=1; prime[j]<=lim && j<=np ;++j)
        {
            if(x%prime[j]==0)
            {
                exp=0;

                while(x%prime[j]==0)
                    x/=prime[j], ++exp;

                num*=(exp+1);

                put=1ll;
                aux=0ll;
                for(int k=0; k<=exp; ++k, put*=(long long)prime[j])
                    aux+= sum*put;

                sum=aux;
            }
        }

        if(x!=1)
        {
            num*=2;
            sum+=sum*x;
        }


        printf("%d %d\n", num%MOD, sum%MOD);
    }

    return 0;
}