Cod sursa(job #516802)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 26 decembrie 2010 14:33:55
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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,d[10000],p[10000],u;
char a[10000];
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%d\n",&test);
for(u=1;u<=test;u++)
     {scanf("%ld\n",&n);
     for(i=1;i<=sqrt(n);i++)
           {a[i]='0';
           d[i]=0;}
     j=2;
     i=1;
     t=n;
     while(j*j<=n)
           {if(a[j]=='0')
                   {while(t!=1)
                           {if(t%j==0)
                                  {d[i]++;
                                  t/=j;
                                  if(t==1)
                                         {p[i]=j;
                                         i++;}}
                           else
                                  {if(d[i]!=0)
                                         {p[i]=j;
                                         i++;}
                                  break;}}
                   for(l=2;l*j<=n;l++)
                   if(a[l*j]=='0')
                           a[l*j]='1';}
           j++;}
     if(t!=1)
           {d[i]=1;
           p[i]=t;
           i++;}
     s=1;
     nr=1;
     for(j=1;j<i;j++)
           {nr=nr*(d[j]+1);
           s=s*(put(p[j],d[j]+1)-1)/(p[j]-1);}
     if(s==1)
           {nr=2;
           s+=n;}
     printf("%ld %ld\n",nr,s%9973);}
fclose(stdin);
fclose(stdout);
return 0;}