Cod sursa(job #980994)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 august 2013 10:32:13
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cstring>

using namespace std;

long long i,t,e[1069],x,y[1000069],q[1000069],Sd,Nrd,prim[1000069],nr,a,Max,j,w,h[1000069];
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<=w;i++) y[i]=q[i]=0;
        w=0;



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

             if (a==1) break;
           }

        if (a!=1) {
             y[++w]++; h[w]=a;

         if (q[w]==0) q[w]=a;
                else q[w]=q[w]*w;
        }

        Nrd=1; Sd=1;

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

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

    }




        return 0;
    }