Cod sursa(job #1854361)

Utilizator dranoellenTurica Leonard-Petru dranoellen Data 22 ianuarie 2017 17:08:34
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>

using namespace std;
int ciur[1000006],len;

void gaureala(int lim)
{
    for(int i=2;i<=30;++i)
    {
        if(ciur[i]==0)
        {
            ciur[len++]=i;
            for(int j=i+i;j<=lim;j+=i)ciur[j]=1;
        }
    }
}

long long lgput(long long x,int p)
{
    int exp[100],i;
    exp[0]=x;
    x=1;
    for(i=1;1<<i<=p;++i)
    {
        exp[i]=(long long)exp[i-1]*exp[i-1];
    }
    --i;
    while(p)
    {
        if(p>=1<<i)
        {
            p-=1<<i;
            x*=(long long)exp[i];
        }
        --i;
    }
    return x;
}


int main()
{
    gaureala(1000000);
    FILE *in =fopen("ssnd.in","r"),*out=fopen("ssnd.out","w");
    int nr,x;
    fscanf(in,"%d",&nr);
    for(int i=0;i<nr;++i)
    {

        fscanf(in,"%d",&x);
        int divp[78500][2],ndiv=0;
        for(int j=0;x-1;++j)
        {
            if(x%ciur[j]==0)
            {
                divp[ndiv][0]=ciur[j];
                divp[ndiv][1]=0;
                while(x%ciur[j]==0)
                {
                    ++divp[ndiv][1];
                    x/=ciur[j];
                }
                ++ndiv;
            }
        }
        long long n=1,s=1;
        for(int j=0;j<ndiv;++j)
        {
            n*=(long long)1+divp[j][1];
            s=s*((long long)
                 (lgput(divp[j][0],1+divp[j][1])-1)/(long long)
                 (divp[j][0]-1));
        }
        printf("%lld %lld\n",n,s);

    }


    return 0;
}