Cod sursa(job #459414)

Utilizator SpiderManSimoiu Robert SpiderMan Data 29 mai 2010 16:17:40
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 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

ll N;
int T;

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 = 2; SQ(i) <= N; ++i)
        if (N % i == 0)
        {
            int p, s;

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

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


    if (AUX > 1)
    {
        NR <<= 1;
        SUM *= (SQ(AUX) - 1) % MOD, SUM %= MOD;
        SUM *= pwlg (AUX - 1, MOD - 2), SUM %= MOD;
    }

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

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

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