Cod sursa(job #980942)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 5 august 2013 23:11:23
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <cstring>

using namespace std;

long long i,t,e[1069],x,y[1000069],q[1000069],Sd,Nrd,prim[1000069],p,nr,a,Max,j;
bool ok;

int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d", &t);
    for (i=1;i<=t;i++) {scanf("%d", &e[i]); if (e[i]>Max) Max=e[i];}

    prim[1]=2;
        nr=1;
        for (x=3; x*x<=Max; x+=2)
        {
            ok=true;
            for (i=1; i<=nr && prim[i]*prim[i]<=x; i++)
                if (x%prim[i]==0) ok=false;
            if (ok) prim[++nr]=x;
        }

    for (j=1; j<=t; j++)
    {
        a=e[j];
        for (i=1;i<=p;i++) y[i]=q[i]=0;



        for (i=1; prim[i]*prim[i]<a; i++)
           {
           if (prim[i]*prim[i]!=0)
            while (a%prim[i]==0)
            {
                y[prim[i]]++;
                a/=prim[i];
                p=prim[i];
                if (q[prim[i]]==0) q[prim[i]]=prim[i];
                else q[prim[i]]=q[prim[i]]*prim[i];
            }

             if (a==1) break;
           }

        y[a]++; if (a>p) p=a;
         if (q[a]==0) q[a]=a;
                else q[a]=q[a]*a;

        Nrd=1; Sd=1;

        for (i=2; i<=p; i++) if (y[i]!=0) Nrd=Nrd*(y[i]+1);
        for (i=2; i<=p; i++)
            if (q[i]!=0) Sd=Sd*(q[i]*i-1)/(i-1);

       printf("%lld %lld\n", Nrd, Sd);

    }




        return 0;
    }