Cod sursa(job #1294329)

Utilizator hopingsteamMatraguna Mihai-Alexandru hopingsteam Data 17 decembrie 2014 12:37:33
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#define NMax 1000005
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long long Nr;
int T,N,Sum;
bool prim[NMax];
int P[NMax],K;

void Sieve()
{
   for(int i = 2; i < NMax; i++)
    {
        if(!prim[i])
        {
            P[++K] = i;
            for(int j = i + i; j < NMax; j += i)
                prim[j] = 1;
        }
    }
}

int Pow(int N, int P)
{
    int Sol =1 ;
    while(P)
    {
        if(P&1)
            Sol = (1LL * Sol * N) % MOD;
        N = (1LL * N * N) % MOD;
        P = P >> 1;
    }
    return Sol;
}

int main()
{
    Sieve();
    fin>>T;
    while(T--)
    {
        fin >> N;
        Nr = 1; Sum = 1;
        for(int f = 1; f <= K && 1LL * P[f] * P[f] <= N; f++)
        {
            int e = 0;
            while(N % P[f] == 0)
            {
                N = N / P[f];
                e ++;
            }
            Nr *= (e+1);

            int Numarator = (Pow(P[f], e + 1) - 1) % MOD ;
            int Numitor = Pow(P[f] - 1, MOD - 2) % MOD ;
            Sum = ( ((Sum * Numarator) % MOD) * Numitor) % MOD;

        }
        if(N>1)
        {
            Nr *= 2;
            Sum = (1LL * Sum * ((N + 1) % MOD) )% MOD;
        }
        fout<<Nr<<" "<<Sum<<"\n";
    }
    return 0;
}