Cod sursa(job #1973363)

Utilizator AndreiMaximIonutMaxim Andrei AndreiMaximIonut Data 24 aprilie 2017 20:48:49
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int Nmax = 1000005;
const short MOD = 9973;
bitset <Nmax> C;
long long P[Nmax];

inline void ciur()
{
    unsigned int i,j;

    for(i=2; i<Nmax; i++)
        if(C[i]==0)
        {
            P[++P[0]]=i;
            for(j=i+i; j<Nmax; j+=i)
                C[j]=1;
        }
}

inline long long pow(long long x, short p)
{
    long long sol=1,a=x;
    short i;
    for(i=1; i <= p; i = (i<<1))
    {
        if((p & i) > 0) sol = (sol * a)%MOD;

        a = (a * a)%MOD;
    }
    return sol;
}
void solutie(long long N)
{

    int i,nd=1;
    long long sd=1;

    for(i=1; P[i]*P[i] <= N; ++i)
        if(N % P[i] == 0)
        {
            short e=0;
            while(N % P[i] == 0)
                e++,N /= P[i];

            long long a=pow(P[i],e+1)%MOD;

            nd=nd*(e+1);

            sd = (sd*((a-1)/(P[i]-1))%MOD)%MOD;

        }

    if(N>1)
    {
        nd*=2;

        sd=(sd*(((N*N-1)%MOD)/(N-1))%MOD)%MOD;
    }

    fout<<nd<<' '<<sd<<'\n';

}
int main()
{
    long long N;
    short t;
    fin>>t;
    ciur();
    for(; t; --t)
    {
        fin>>N;
        solutie(N);
    }
    return 0;
}