Cod sursa(job #1129489)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 27 februarie 2014 22:36:04
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

ifstream in ("ssnd.in");
ofstream out ("ssnd.out");

const int MAXN = 1000000;
const int MOD = 9973;

int K;
bitset <1000010> Ciur;
int Prime[80000];

void Make_Ciur ()
{
    int i, j;

    for (i = 3; i * i <= MAXN; i += 2)
        if (!Ciur[i])
            for (j = i * i; j <= MAXN; j += 2 * i)
                Ciur[j] = 1;

    Prime[++ K] = 2;
    for (i = 3; i <= MAXN; i += 2)
        if (!Ciur[i])
            Prime[++ K] = i;
}

inline int lgpow (int A, int P)
{
    int ret = 1;
    A %= MOD;

    for ( ; P; P >>= 1){
        if (P & 1)
            ret = (1LL * ret * A) % MOD;

        A = (1LL * A * A) % MOD;
    }

    return ret;
}

void Solve ()
{
    long long N, nr = 1;
    int i, e, p1, p2, sum = 1;

    in >> N;

    for (i = 1; i <= K && 1LL * Prime[i] * Prime[i] <= N; i ++){
        if (N % Prime[i])
            continue;

        e = 0;
        while (N % Prime[i] == 0){
            N /= Prime[i];
            e ++;
        }

        p1 = (lgpow (Prime[i], e + 1) - 1 + MOD) % MOD;
        p2 = lgpow (Prime[i] - 1, MOD - 2);

        sum = (((sum * p1) % MOD) * p2) % MOD;
        nr *= 1LL * (e + 1);
    }

    if (N > 1){
        nr *= 2;
        sum = (1LL * sum * (N + 1)) % MOD;
    }

    out << nr << " " << sum << "\n";
}

int main()
{
    Make_Ciur ();

    int T;
    for (in >> T; T; T --)
        Solve ();

    return 0;
}