Cod sursa(job #473086)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 27 iulie 2010 22:35:30
Problema Suma si numarul divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
//nr prime pana la un milion
	//pentru fiecare numar nk
	//generarea listei de nr prime la care se divide nk si de cate ori se divide la aceste numere prime
	//afisarea numarului (1+n1)*(1+n2)*...*(1+nn)
	//[p1^(n1+1)-1]/[p1-1]* [p2^(n2+1)-1]/[p2-1] modulo 9973
	
//#include <math.h>
#include <cstdio>
#define X 81430
#define N 1000001
#define mod 9973
int prim[X],vf=-1;
int sieve[N];

void calc_sieve()
{int i,j;
 for (i=3;i*i<N;i++)
 {if(sieve[i]==0)
  {for (j=i*i;j<N;j+=i)
   {sieve[j]=1;   
   }  
  }
 }
 prim[++vf]=2;
 for (i=3;i<N;i+=2)
 {if(sieve[i]==0)
  {prim[++vf]=i;
  }
 } 
}

long long pow(long long x,int pow)
{long long int p=1;
 for (int i=1;i<=pow;i++)
 {p*=x;
 }
 return p;
}

int main ()
{int i,t,j,cnt;
 long long int a,p;
 long long no,sum;
 freopen("ssnd.in","r",stdin);
 freopen("ssnd.out","w",stdout);
 scanf("%d",&t);

 calc_sieve();
 for (i=1;i<=t;i++)
 {scanf("%lld",&a);
  no=1;
  sum=1;
  for (j=0;j<vf&&a>1;j++)
  {if(a%prim[j]==0)
   {cnt=1;
    a/=prim[j];
    while(a%prim[j]==0)
    {a/=prim[j];
     cnt++;
    }
    no*=(cnt+1);
    if(cnt>1)
     sum=(sum*(pow(prim[j],cnt+1)-1)/(prim[j]-1))%mod;
    else
     sum=(sum*(prim[j]+1))%mod;
   }
  }
  printf("%lld %lld\n",no,sum);
 }
 return 0;
}