Cod sursa(job #1643340)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 9 martie 2016 18:34:02
Problema Suma si numarul divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <bitset>
#define InFile  "ssnd.in"
#define OutFile "ssnd.out"
#define MAX 1000001
#define MOD 9973

using namespace std;

ifstream fin  (InFile);
ofstream fout (OutFile);

unsigned long int N;
int T, K, P[MAX];
bitset <MAX> seen;

void sieve ()
{
    unsigned int i, j;
    for (i=2; i<MAX; i++)
    {
        if (seen[i] == 0)
        {
            P[++K] = i;
            for (j=i+i; j<MAX; j+=i)
                seen[j] = 1;
        }
    }
}

inline 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;
}

void solve ()
{
    int i;
    fin >> N;
    int nd=1, sd=1;
    for (i=1; i<=K && 1LL*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);
        int p1 = (pow(P[i],p+1)-1) % MOD;
        int p2 = pow(P[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;
    fout << '\n';
}

int main ()
{
    sieve();
    for (fin >> T; T; --T)
        solve ();
}