Cod sursa(job #1250953)

Utilizator hopingsteamMatraguna Mihai-Alexandru hopingsteam Data 28 octombrie 2014 19:40:46
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define NMax 1000005
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long long Nr;
int T,N,Sum;
bool prim[NMax];
int P[NMax],K;

void Sieve()
{
    for(int i=2;i<NMax;i++)
        prim[i]=1;

    for(int i=2;i<NMax;i++)
    {
        if(prim[i])
            {
                P[++K]=i;
                for(int j=i+i;j<NMax;j+=i)
                    prim[j]=0;
            }
    }
}

int Pow(int N, int P)
{
    int Sol=1;
    while(P)
    {
        if(P&1)
            Sol=(1LL*Sol*N)%MOD;
        N = (1LL*N*N)% MOD;
        P=P>>1;
    }
    return Sol;
}

int main()
{
    Sieve();
    fin>>T;
    while(T--)
    {
        fin>>N;

        Nr=1; Sum = 1;

        for(int f=1;f<=K && 1LL*P[f]*P[f]<=N ;f++)
        {
            int e=0;
            while(N%P[f]==0)
            {
                N=N/P[f]; e++;
            }
            Nr *= (e+1);


            int Numarator = (Pow(P[f],e+1)-1) % MOD ;
            int Numitor = Pow(P[f]-1,MOD-2) % MOD ;
            Sum=  ( ((Sum * Numarator)%MOD) * Numitor) % MOD;

        }

        if(N>1)
            {
                Nr *= 2;
                Sum = (1LL*Sum * ((N+1) %MOD) )%MOD;
            }


        fout<<Nr<<" "<<Sum<<"\n";
    }
    return 0;
}