Cod sursa(job #1134624)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 6 martie 2014 19:56:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
using namespace std;

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

#define MOD 9973

int T;
long long N;
bool prim[1000005];
vector<int> Prime;

void Sieve();
void Solve();
int Pow(int a, int b);

int main()
{
    is >> T;
    Sieve();
    for ( int i = 1; i <= T; ++i )
        Solve();
    return 0;
}

void Sieve()
{
    for (int i = 2; i <= 1000000; ++i )
    {
        if ( prim[i] == false )
        {
            Prime.push_back(i);
            for ( int j = 2 * i; j <= 1000000; j += i )
                prim[j] = true;
        }
    }
}

void Solve()
{
    is >> N;
    int vl = N;
    int Sol1(1), Sol2(1);
    int nrd;
    for ( int i = 0; i < Prime.size() && 1ll* Prime[i] * Prime[i] <= vl  ; ++i )
    {
        if ( N == 1 )
            break;
        if ( N % Prime[i] != 0 )
            continue;
        nrd = 0;
        while ( N % Prime[i] == 0 )
        {
            N /= Prime[i];
            nrd++;
        }
        Sol1 *= (nrd+1);
        Sol2 *= ( (Pow(Prime[i],nrd+1)-1)%MOD *  Pow(Prime[i]-1,MOD-2)%MOD ) ;
        if ( Sol2 >= MOD )
            Sol2 %= MOD;
    }
    if ( N == 1 )
        os << Sol1 << " " << Sol2 << '\n';
    else
    {
        Sol1 = 2;
        Sol2 = N+1;
        Sol2 %= MOD;
        os << Sol1 << " " << Sol2 << '\n';

    }
}

int Pow(int a, int b)
{
    int aux;
    if ( b == 0 )
        return 1;
    aux = Pow(a,b/2);
    aux = (1ll * aux * aux)%MOD;
    if ( b % 2 == 1 )
        aux = (1ll*aux*a)%MOD;

    return aux;
}