Cod sursa(job #1419876)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 16 aprilie 2015 23:52:44
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;

const int dmax = 1000005;
const int mod = 9973;

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

int T; long long N; int NR_DIV; int SUMA_DIV;
bool ciur[dmax]; int v[dmax]; int w;

void CIUR()
{
    ciur[0]=1; ciur[1]=1;

    for(int i=2; i<=dmax; i++)
    {
        if(ciur[i]==0)
        {
            v[++w]=i;
            for(int j=i+i; j<=dmax; j=j+i) ciur[j]=1;
        }
    }
}

int Exp_log(int x, int y) //CALCULAM x^y PRIN RIDICARE LA PUTERE IN TIMP LOGARITMIC
{
    int answer=1;

    while(y)
    {
        if(y&1) answer=(answer*x)%mod;

        x=x*x%mod;
        y >>= 1;
    }

    return answer;
}

int main()
{
    int exp;

    in >> T;

    CIUR();

    for(int i=1; i<=T; i++)
    {
        in >> N;

        NR_DIV=1; SUMA_DIV=1;

        for(int k=1; k<=w && v[k]*v[k]<=N; k++)
        {
            if(N%v[k]==0)
            {
                exp=0;
                while(N%v[k]==0) {exp++; N=N/v[k];}

                NR_DIV=NR_DIV*(exp+1)%mod;
                SUMA_DIV=SUMA_DIV*((Exp_log(v[k],exp+1)-1)/(v[k]-1))%mod;
            }
        }

        if(N > 1) {NR_DIV=2*NR_DIV%mod; SUMA_DIV=SUMA_DIV*(N+1)%mod;}

        out << NR_DIV <<" "<< SUMA_DIV << '\n';

    }

    return 0;
}