Cod sursa(job #2484104)

Utilizator cnamdTomsa Gelu cnamd Data 30 octombrie 2019 18:02:09
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int nmax=1000000;
bool p[1000001];
int prime [100001],nrp;

void ciur()
{
    int i,j;
    memset(p,1, sizeof p);
    p[0]=0;
    p[1]=0;
    for(i=2;i<=nmax;i++)
    {
        if(p[i]==1)
        {
            nrp++;
            prime[nrp]=i;
            for(j=2;j<=nmax/i;j++)
                p[i*j]=0;
        }
    }
}

void rezolva(long long nr)
{
    long long d,p,i,nrdiv=1,sumdiv=1,dp=1;
    i=1;
    d=prime[1];
    while((d*d<=nr) && (i<=nrp))
    {
        p=0;
        dp=1;
        while(nr%d==0)
        {
            p++;
            nr=nr/d;
            dp=dp*d;
        }
        nrdiv=nrdiv*(p+1);
        sumdiv=sumdiv*(dp*d-1)/(d-1);
        i++;
        d=prime[i];
    }
    if(nr>1)
    {
        nrdiv=nrdiv*2;
        sumdiv=sumdiv*(1+nr);
    }
    fout<<nrdiv<<' '<<sumdiv<<'\n';
}

int main()
{
    int t,i;
    long long nr;
    ciur();
    fin>>t;
    for(i=1;i<=t;i++)
    {
        fin>>nr;
        rezolva(nr);
    }
}