Cod sursa(job #1193521)

Utilizator ZenusTudor Costin Razvan Zenus Data 31 mai 2014 22:26:00
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

using namespace std;

#define LL long long
#define MOD 9973
#define NMAX 1000005
#define max(a,b) ((a>b) ? a : b)

unsigned LL N,i,j,S,P,X,E;
bool sel[NMAX];
LL prime[NMAX/10];

LL pow(LL baza,int putere)
{
    LL P=1;
    for (int i=1; i<=putere; ++i) P*=baza;

    return P;
}

LL calcul(LL A,int X)
{
    return ((pow(A,X)-1)/(A-1));
}

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

    scanf("%lld",&N);

    for (i=2; i<NMAX; i++)
        if (!sel[i])
        {
            prime[++prime[0]]=i;
            for (j=2*i; j<NMAX; j+=i) sel[j]=true;
        }

    while (N--)
    {
        scanf("%lld",&X);
        P=S=i=1;

        while (X && X>=prime[i]*prime[i])
        {
            E=0;

            while (X%prime[i]==0)
            {
                X/=prime[i];
                ++E;
            }

            if (E>0) S=((S%MOD)*calcul(prime[i],E+1))%MOD,P=P*(E+1);

            ++i;
        }

        if (X>1)
        {
            P*=2;
            S=((S%MOD)*((X*X-1)/(X-1)))%MOD;
        }

        printf("%lld %lld\n",P,S);
    }

    return 0;
}