Cod sursa(job #523349)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 17 ianuarie 2011 20:48:31
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream.h>
#include<iostream.h>
#include<math.h>
#define N 1000000
int test,u,nr,p[N]={0};
long long n,t,s;
long k=0,i,j,l,q,r,x[N];

void sieve(long x[N],long *k,int p[N])
{long i,j;
x[++(*k)]=2;
for(i=1;((i*i)<<1)+(i<<1)<=N;i+=1)      
if((p[i>>3]&(1<<(i&7)))==0) 
      {for(j=((i*i)<<1)+(i<<1);(j<<1)+1<=N;j+=(i<<1)+1) 
                p[j>>3]|=(1<<(j&7));}
for(i=1;2*i+1<=N;++i) 
if((p[i>>3]&(1<<(i&7)))==0)
      x[++(*k)]=2*i+1;}
            
int main()
{ifstream f1("ssnd.in");
ofstream f2("ssnd.out");
f1>>test;
sieve(x,&k,p);
for(u=1;u<=test;u++)
     {f1>>n;
     i=1;
     t=n;
     s=1;
     nr=1;
     while(i<=k&&t>1)
           {j=0;
           while(t%x[i]==0)
                  {j++;
                  t/=x[i];
                  if(t==1)
                         {nr=nr*(j+1);
                         if(j==1)
                               s=s*(x[i]+1);
                         else
                               s=s*((long long)pow(x[i],j+1)-1)/(x[i]-1);}}
           if(j!=0&&t>1)
                  {nr=nr*(j+1);
                  if(j==1)
                         s=s*(x[i]+1);
                  else
                         s=s*((long long)pow(x[i],j+1)-1)/(x[i]-1);}
           i++;}
     if(s==1)
           {nr=2;
           s+=n;}
     f2<<nr<<" "<<s%9973<<endl;}
f1.close();
f2.close();
return 0;}