Cod sursa(job #755633)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 16:44:42
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb

#include <fstream>
using namespace std;

char Er[1000005];
long Prime[100000];
long PrimCount;

void Erathostene(long N)
{
 long i,j;
 for (i = 2;i <= N;i += 1)
  {
   if (Er[i] == 0)
     {
      Prime[PrimCount] = i;
      PrimCount += 1;
      for (j = (i << 1);j <= N;j += i)
       {
        Er[j] = 1;
       }
     }
  }
}

long powint(long a,long n)
{
 a %= 9973;
 long r,p;
 r = 1;
 p = a;
 while (n > 0)
  {
   if (n & 1)
     {
      r = (r * p) % 9973;
     }
   p = (p * p) % 9973;
   n >>= 1;
  }
 return r;
}

long computesumelement(long prim,long exp)
{
 long p1,p2;
 p1 = powint(prim,exp + 1) - 1;
 p2 = powint(prim - 1,9973 - 2);
 return ((p1 % 9973) * p2) % 9973;
}

long Factori[100000];
long CFac[100000];

void Compute(long n,long &r1,long &r2)
{
 long primpos = 0;
 long fpos = 0;
 while ((n > 1) && (primpos < PrimCount))
  {
   if ((n % Prime[primpos]) == 0)
     {
      Factori[fpos] = Prime[primpos];
      CFac[fpos] = 0;
      while ((n % Prime[primpos]) == 0)
       {
        CFac[fpos] += 1;
        n /= Prime[primpos];
       }
      fpos += 1;
     }
   primpos += 1;
  }

 long i;
 r1 = 1;
 for (i = 0;i < fpos;i += 1)
  {
   r1 = r1 * (CFac[i] + 1);
  }

 r2 = 1;
 for (i = 0;i < fpos;i += 1)
  {
   r2 = (r2 * computesumelement(Factori[i],CFac[i])) % 9973;
  }
}

int main(void)
{
 Erathostene(1000000);
 long T,i,n,r1,r2;
 fstream fin("ssnd.in",ios::in);
 fstream fout("ssnd.out",ios::out);
 fin >> T;
 for (i = 0;i < T;i += 1)
  {
   fin >> n;
   Compute(n,r1,r2);
   fout << r1 << " " << r2 << "\n";
  }
 fin.close();
 fout.close();
 return 0;
}