Cod sursa(job #1379810)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 6 martie 2015 19:37:46
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<iostream>
#include<cmath>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long N,i,j,T,rad,psuma,pnr,put,nr,exponent,da,putere;
long long nrprime[500100];
bool nprim[500100];

void eratos();
long long pow_care_merge_cum_trebuie(int,int);

int main()
{
    f>>T;
    nrprime[++nrprime[0]]=2;
    eratos();
    for (i=0;i<T;++i)
    {
        f>>N;
        rad=sqrt(N);
        psuma=pnr=1;
        put=0;
        for (j=1;j<=nrprime[0] && nrprime[j]<=rad;++j)
        {
            if (N%nrprime[j]==0)
            {
                put=0;
                while (N%nrprime[j]==0)
                {
                    ++put;
                    N/=nrprime[j];
                }
                pnr*=(put+1);
                nr=nrprime[j];
                exponent=put+1;
                putere=pow_care_merge_cum_trebuie(nr,exponent);
                da=(putere-1)/(nr-1);
                psuma*=da;
            }
        }
        if (N>1)
        {
            pnr*=2;
            nr=N;
            exponent=2;
            putere=pow_care_merge_cum_trebuie(nr,exponent);
            da=(putere-1)/(nr-1);
            psuma*=da;
        }
        g<<pnr<<' '<<psuma%9973<<'\n';
    }
    f.close();g.close();
    return 0;
}

void eratos()
{
    for (i=1;(i<<1)+1<=1000005;++i)
    {
        if (!nprim[i])
        {
            nrprime[++nrprime[0]]=(i<<1)+1;
            for (j=(i*i<<1)+(i<<1);(j<<1)+1<=1000005;j+=(i<<1)+1)
                nprim[j]=true;
        }
    }
}

long long pow_care_merge_cum_trebuie(int b,int e)
{
    long long prod=1;
    for (int cont=0;cont<e;++cont)
        prod*=b;
    return prod;
}