Cod sursa(job #1221362)

Utilizator EpictetStamatin Cristian Epictet Data 20 august 2014 11:13:53
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <bitset>
#define LL long long
#define Max_N 1000010
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int T, K, P[Max_N];
LL N;
bitset < Max_N > V;

void Ciur()
{
    for (int i=2; i<=Max_N; i++)
    {
        if (!V[i])
        {
            P[++K] = i;
            for (int j=i+i; j<=Max_N; j+=i)
                V[j] = 1;
        }
    }
}

int lgput(LL x, LL p)
{
    LL val = 1;
    //x %= MOD;
    while (p)
    {
        if (p & 1) val = val * x;
        x = x * x;
        p = p / 2;
    }
    return val;
}

void Solve()
{
    fin >> N;
    int nd = 1, sd = 1;

    for (int i=1; i <= K && P[i] * P[i] <= N; i++)
    {
        if (N % P[i]) continue;
        int p = 0;

        while (N % P[i] == 0)
        {
            N /= P[i];
            p++;
        }

        nd *= (p + 1);

        sd = (sd * (lgput(P[i], p+1) - 1) / (P[i] - 1)) % MOD;
    }

    if (N > 1)
    {
        nd *= 2;
        sd = (sd * (N * N - 1) / (N - 1)) % MOD;
    }

    fout << nd << ' ' << sd << '\n';
}

int main()
{
    Ciur();
    for (fin >> T; T; T--)
    {
        Solve();
    }
    fout.close();
    return 0;
}