Cod sursa(job #1250941)

Utilizator hopingsteamMatraguna Mihai-Alexandru hopingsteam Data 28 octombrie 2014 19:26:43
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 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=(Sol*N)%MOD;
        N = (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);

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

        }

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


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