Cod sursa(job #473092)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 27 iulie 2010 23:11:16
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 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 <cstdio>
#define X 81430
#define N 1000001
#define mod 9973
int prim[X],vf=-1;
bool sieve[N];

void calc_sieve()
{int i,j;
 prim[++vf]=2;
 for (i=3;i*i<N;i+=2)
 {if(sieve[i]==0)
  {prim[++vf]=i;
   for (j=i*i;j<N;j+=i)
   {sieve[j]=1;   
   }  
  }
 }
 for (;i<N;i+=2)
 {if(sieve[i]==0)
  {prim[++vf]=i;
  }
 }
}
/*
long long pow(long long x,int pow)
{long long int p=1,pr=x;
 while(pow)
 {if(pow&1)
  {p*=pr;
  }
  pow/=2;
  pr=pr*pr;
 }
 return p;
} */
long long pow(long long x,int pow)
{long long pr=1;
 for (int i=1;i<=pow;i++)
 {pr*=x;
 }
 return pr;
}
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%(p=prim[j])==0)
   {cnt=1;
    a/=p;
    while(a%p==0)
    {a/=p;
     cnt++;
    }
    no*=(cnt+1);
    if(cnt>1)
     sum=(sum*(pow(p,cnt+1)-1)/(p-1))%mod;
    else
     sum=(sum*(p+1))%mod;
   }
  }
  printf("%lld %lld\n",no,sum);
 }
 return 0;
}