Cod sursa(job #1854371)

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

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

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

int lgput(int x,int p)
{
    int exp[100],i;
    exp[0]=x;
    x=1;
    for(i=1;1<<i<=p;++i)
    {
        exp[i]=exp[i-1]*exp[i-1];
    }
    --i;
    while(p)
    {
        if(p>=1<<i)
        {
            p-=1<<i;
            x*=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;
            }
        }
        int n=1,s=1;
        for(int j=0;j<ndiv;++j)
        {
            n*=1+divp[j][1];
            s=(s*(
                 (lgput(divp[j][0],1+divp[j][1])-1)/
                 (divp[j][0]-1))
               )%9973;
        }
        fprintf(out,"%d %d\n",n,s);
    }


    return 0;
}