Cod sursa(job #2070889)

Utilizator FredyLup Lucia Fredy Data 19 noiembrie 2017 23:56:00
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

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

#define lim 1000005
#define mod 9973
long long n;
int T, K, P[lim];
bool viz[lim];

void ciur()
{
    for (int i=2; i<lim; i++)
        if (viz[i] == 0)
        {
            P[++K]=i;
            for (int j=i+i; j<lim; j+=i)
                viz[j]=1;
        }
}

int lg_put (int x, int p)
{
    int rez=1;
    x%=mod;
    for (; p; p>>=1)
    {
        if (p&1)
            rez = (rez*x) % mod;
        x = (x*x) % mod;
    }
    return rez;
}


void solve()
{
    int nd=1, sd=1;
    fin>>n;
    for (int 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 = (lg_put (P[i], p+1) - 1) % mod;
        int p2 = lg_put (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<<'\n';
}



int main()
{
    ciur();
    fin>>T;
    while (T--)
        solve ();

    fout.close();
    return 0;
}