Cod sursa(job #755683)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 18:34:25
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb

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

char Er[7200];
long Prime[1000];
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 %= 9901;
 long r,p;
 r = 1;
 p = a;
 while (n > 0)
  {
   if (n & 1)
     {
      r = (r * p) % 9901;
     }
   p = (p * p) % 9901;
   n >>= 1;
  }
 return r;
}

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

void Compute(long A,long B,long &C)
{
 C = 1;
 long primpos = 0;
 long cnt;
 while ((A > 1) && (Prime[primpos] * Prime[primpos] <= A))
  {
   if ((A % Prime[primpos]) == 0)
     {
      cnt = 0;
      do
        {
         cnt += 1;
         A /= Prime[primpos];
        }
       while ((A % Prime[primpos]) == 0);

      C = (C * computesumelement(Prime[primpos],cnt * B)) % 9901;
     }
   primpos += 1;
  }
 if (A > 1)
   {
    if (A == 9901)
      {
       return ;
      }
    C = (C * computesumelement(A,B)) % 9901;
   }
}

int main(void)
{
 Erathostene(7100);
 long A,B,C;
 fstream fin("sumdiv.in",ios::in);
 fstream fout("sumdiv.out",ios::out);
 fin >> A >> B;
 if (A == 1)
   {
    fout << 1;
    goto gata;
   }
 if (B == 0)
   {
    fout << 1;
    goto gata;
   }
 if (A == 0)
   {
    fout << 0;
    goto gata;
   }
 Compute(A,B,C);
 fout << C;
 gata:;
 fin.close();
 fout.close();
 return 0;
}