Cod sursa(job #1083607)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 16 ianuarie 2014 09:18:52
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

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

const int LIM = 1e6;
const int MOD = 9973;

vector <bool> E(LIM + 10, 1);
vector <int> prim;

long long T, N, sd, nd, fr;

void Precompute()
{
    for(int i = 4; i <= LIM; i += 2)
        E[i] = 0;
    prim.push_back(2);
    for(int i = 3; i <= LIM; i += 2)
        if(E[i])
        {
            prim.push_back(i);
            for(int j = i + i; j <= LIM; j += i)
                E[j] = 0;
        }
}

int POW(int x, int p)
{
    int rez = 1; x %= MOD;

    for(; p; p >>= 1)
    {
        if(p & 1)
        {
            rez *= x;
            rez %= MOD;
        }

        x *= x;
        x %= MOD;
    }
    return rez;
}

int main()
{
    Precompute();
    fin >> T;
    while(T--)
    {
        fin >> N;
        nd = sd = 1;
        for(int i = 0; i < prim.size() && 1LL * prim[i] * prim[i] <= N; i++)
            if(!(N % prim[i]))
            {
                fr = 0;
                while(!(N % prim[i]))
                {
                    N /= prim[i];
                    fr++;
                    //cout<<N<<' ';
                }
                //cout<<endl;
                nd *= (fr + 1);

                int p1 = (POW(prim[i], fr + 1) - 1) % MOD;
                int p2 = (POW(prim[i] - 1, MOD - 2)) % MOD;

                sd = (((sd * p1) % MOD) * p2) % MOD;
            }
        if(N > 1)
        {
            nd *= 2;
            sd = (1LL * sd * (N + 1)) % MOD;
        }

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