Cod sursa(job #755644)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 17:25:04
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb

#include <fstream>
#include <math.h>
using namespace std;

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

void Erathostene(long N)
{
 Prime[0] = 2;
 PrimCount = 1;
 long i,j;
 for (i = 3;i <= N;i += 2)
  {
   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;
}

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

      r1 = r1 * (cnt + 1);
      r2 = (r2 * computesumelement(Prime[primpos],cnt)) % 9973;
     }
   primpos += 1;
  }
 if (n > 1)
   {
    r1 *= 2;
    r2 = (r2 * computesumelement(n,1)) % 9973;
    fpos += 1;
   }
}

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;
}