Cod sursa(job #755639)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 17:07:52
Problema Suma si numarul divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb

#include <fstream>
#include <math.h>
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 long powint(long long a,long long n)
{
 a %= 9973;
 long 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 long computesumelement(long long prim,long long exp)
{
 long long p1,p2;
 p1 = powint(prim,exp + 1) - 1;
 p2 = powint(prim - 1,9973 - 2);
 return (p1 * p2) % 9973;
}

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

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

 long 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 long T,i,r1,r2;
 long long n;
 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;
}