Cod sursa(job #516633)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 25 decembrie 2010 11:18:22
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<math.h>
int main()
{int test;
long n,t,nr,s,j,i,k,d[20000],p[20000],v[20000],l;
char a[20000];
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%d\n",&test);
for(l=1;l<=test;l++)
     {scanf("%ld\n",&n);
     for(i=1;i<=sqrt(n);i++)
           {a[i]='0';
           d[i]=0;}
     j=2;
     k=0;
     for(i=2;i<=sqrt(n);i++)
     if(a[i]=='0'&&i*i>sqrt(n)&&n%i==0)
           v[++k]=i;
     while(j*j<=sqrt(n))
           {if(a[j]=='0')
                   {v[++k]=j;
                   for(t=2;t*j<=sqrt(n);t++)
                   if(a[t*j]=='0')
                           a[t*j]='1';}
           j++;}
     while(a[j]=='1')
           j++;
     v[++k]=j;
     i=1;
     j=1;
     t=n;
     while(i<=k&&t!=0)
           {if(t%v[i]==0)
                   {p[j]=v[i];
                   d[j]++;
                   t=t/v[i];}
           else
                   {i++;
                   if(d[j]!=0)
                         j++;}}
     s=1;
     nr=1;
     for(i=1;i<=j;i++)
           {nr=nr*(d[i]+1);
           s=s*((long)(pow(p[i],d[i]+1))-1)/(p[i]-1);}
     if(s==1)
           {nr=2;
           s+=n;}
     printf("%ld %ld\n",nr,s);}
fclose(stdin);
fclose(stdout);
return 0;}