Cod sursa(job #2086071)

Utilizator rangal3Tudor Anastasiei rangal3 Data 11 decembrie 2017 12:29:15
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <cstring>
#define file "ssnd"
#define N 1000000
#define MOD 9973
using namespace std;

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

long long t,n;
long long p;
long long  prim[N+3],doarprim[N/2],pn; // 0 - prim 1 -Neprim

inline long long rid_log(const long long &A,const long long &B)
{
    if(B == 1) return A;
    else if(B < 1) return 1;

    long long sol = rid_log(A,B/2);

    if(B%2) return ((sol*sol)%MOD * A)%MOD;
        else return (sol*sol)%MOD;
}

inline long long inv_mod(long long X)
{
    return rid_log(X,MOD-2);
}

void Ciur()
{
    prim[1] = 1;
    doarprim[++pn] = 2;
    for(int i=4; i<=N; i+=2)
        prim[i] = 1;
    for(int i=3; i*i <= N; i+=2)
        if(!prim[i])
        {
            for(int d = i*i; d<=N; d += 2*i)
                prim[d] = 1;
        }
    for(int i=3; i<=N; ++i)
        if(!prim[i])
            doarprim[++pn] = i;
}

void afis_ciur()
{
    for(int i=1; i<=pn; ++i)
        fout<<doarprim[i]<<" ";
    fout<<endl;
}

inline void desc()
{
    long long sola,solb;
    sola = solb = 1;
    for(long long  i=1; i <= pn && 1LL * doarprim[i]*doarprim[i] <= n; ++i)
    {
        p = 0;
        while(n % doarprim[i] == 0) ++p, n/=doarprim[i];


        if(p > 0)
        {
            sola = (sola*(p+1))%MOD;
            solb = (solb*((rid_log(doarprim[i],p+1) - 1) * inv_mod(doarprim[i]-1) % MOD) ) %MOD;
        }
    }

    if(n > 1)
       sola = (sola*2)%MOD,
       solb = (solb*(n+1)) %MOD;

    fout<<sola<<" "<<solb<<"\n";
}


int main()
{
    Ciur();
    fin>>t;
    while(t--)
    {
        fin>>n;
        desc();
        //afis();
    }
    fin.close();
    fout.close();
    return 0;
}