Cod sursa(job #467641)

Utilizator SpiderManSimoiu Robert SpiderMan Data 29 iunie 2010 19:15:48
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>

#define ll    long long
#define FIN   "ssnd.in"
#define FOU   "ssnd.out"
#define PW(i) ( 1 << (i) )
#define SQ(i) ( (ll) (i) * (i) )
#define MOD   9973
#define MAX   1000005

ll N;
int T, P[MAX], n = 0;
unsigned char V[1 << 17];

void prec ()
{
    P[++n] = 2;

    for (int i = 3; i < MAX; i += 2)
    {
        if (V[i >> 4] & (1 << ((i >> 1) & 7))) continue; // = daca (V[i] == 1)

        P[++n] = i;                                      // introducem pe i ca numar prim

        for (int j = i + (i << 1); j < MAX; j += i << 1)
            V[j >> 4] |= 1 << ((j >> 1) & 7);            // V[j] = 1;
    }
}

inline int pwlg (int n, int p)
{
    int a = n, sol = 1;

    for (int i = 0; PW(i) <= p; ++i)
    {
        if ( (PW(i) & p) > 0)
            sol = (sol * a) % MOD;

        a = SQ(a) % MOD;
    }

    return sol;
}

void ssnd ()
{
    scanf("%lld", &N);

    int	NR = 1, SUM = 1;

    ll AUX = N;

    for (int i = 1; SQ ( P[i] ) <= N; ++i)
        if (N % P[i] == 0)
        {
            int p, s;

            for (p = 0, s = 1; AUX % P[i] == 0; AUX /= P[i], s *= P[i], ++p ) ;

            NR *= p + 1;
            SUM *= ((ll) s * P[i] - 1) % MOD, SUM %= MOD;
            SUM *= pwlg (P[i] - 1, MOD - 2), SUM %= MOD;
        }


    if (AUX > 1)
    {
        NR <<= 1;
        SUM *= ( AUX + 1 ) % MOD, SUM %= MOD ;
    }

    printf("%d %d\n", NR, SUM);
}

int main ()
{
    freopen(FIN, "r", stdin);
    freopen(FOU, "w", stdout);

    prec () ;

    for (scanf("%d", &T); T ; --T)
        ssnd () ;
}