Cod sursa(job #1150384)

Utilizator c0rn1Goran Cornel c0rn1 Data 22 martie 2014 22:19:53
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#define M 9973

using namespace std;

int nrp, nrput, aux;
long long int nrdiv, sdiv, n, prim[1000001];
bool p[1000001];
void ciur()
{
    for (int i=2; i<=1000000; i++)
    {
        if (p[i]==false)
        {
            prim[nrp++]=i;
            for (int j=2*i; j<=1000000; j+=i)
                p[j]=true;
        }
    }
}

long long int ridput(long long int b, int p)
{
    long long int r=1;
    while (p)
    {
        if (p%2==0)
        {
            b*=b;
            p>>=1;
        }
        p--;
        r*=b;
    }
    return r;
}

void rezolv(long long int x)
{
    while(n%x==0)
    {
        nrput++;
        n/=x;
    }
    nrput++;
    sdiv=(sdiv*((ridput(x, nrput)-1)/(x-1))%M)%M;
    nrdiv*=nrput;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ciur();
    int t;
    for (scanf("%d", &t); t--;)
    {
        nrdiv=sdiv=1;
        scanf("%lld", &n);
        for (int i=0; prim[i]*prim[i]<=n; i++)
            if (n%prim[i]==0)
            {
                rezolv(prim[i]);
                nrput=0;
            }
        if (n>1)
        {
            nrdiv<<=1;
            sdiv*=((n*n-1)/(n-1))%M;
        }
        printf("%lld %lld\n", nrdiv, sdiv%M);
    }
    return 0;
}