Cod sursa(job #516652)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 25 decembrie 2010 13:12:14
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#include<math.h>
long put(long x,long n)
{if(n==0)
      return 1;
if(n%2==0)
      return put(x,n/2)*put(x,n/2);
else
      return x*put(x,(n-1)/2)*put(x,(n-1)/2);}

int main()
{int test,l;
long n,t,nr,s,j,i,k,d[40000],p[40000],v[40000];
char a[40000];
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;
     while(j*j<=n)
           {if(a[j]=='0')
                   {v[++k]=j;
                   for(t=2;t*j<=n;t++)
                   if(a[t*j]=='0')
                           a[t*j]='1';}
           j++;}
     t=n;
     i=1;
     while(i<=k)
           {if(t%v[i]==0)
                   t/=v[i];
           else
                   i++;}
     if(t>sqrt(n))
           v[++k]=t;
     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*(put(p[i],d[i]+1)-1)/(p[i]-1);}
     if(s==1)
           {nr=2;
           s+=n;}
     printf("%ld %ld\n",nr,s%9973);}
fclose(stdin);
fclose(stdout);
return 0;}