Cod sursa(job #755660)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 17:56:35
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.87 kb

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

typedef char TChar;
typedef TChar *PChar;
typedef long long TTime;
#define DEBUGGING

#ifdef DEBUGGING
#include <windows.h>
#include <conio.h>

TTime CyclesPerSecond = 0;

void InitCycles(void)
{
 LARGE_INTEGER LI;
 QueryPerformanceFrequency(&LI);
 CyclesPerSecond = LI.QuadPart;
}

TTime GetCycles(void)
{
 LARGE_INTEGER LI;
 QueryPerformanceCounter(&LI);
 return LI.QuadPart;
}

void CyclesToTime(TTime Cycles,PChar Message)
{
 printf("%s : %lld\n",Message,(Cycles * 1000000) / CyclesPerSecond);
}

#else

void InitCycles(void)
{
}

TTime GetCycles(void)
{
 return 0;
}

void CyclesToTime(TTime,PChar)
{
}

#endif

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 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,9971);
 return (p1 * p2) % 9973;
}

long long isqrt(long long N)
{
 long long op = N;
 long long res = 0;
 long long one;
 one = ((long long)(1)) << (((8 * 8) - 2));
 while (one > op)
  {
   one >>= 2;
  }
 while (one != 0)
  {
   if (op >= (res + one))
     {
      op -= res + one;
      res = (res >> 1) + one;
     }
    else
     {
      res >>= 1;
     }
   one >>= 2;
  }
 return res;
}

void Compute(long long n,long &r1,long &r2)
{
 r1 = 1;
 r2 = 1;
 long primpos = 0;
 long stop = isqrt(n);
 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 <<= 1;
    r2 = (r2 * computesumelement(n,1)) % 9973;
   }
}

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