Cod sursa(job #1573435)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 19 ianuarie 2016 18:07:24
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<iostream>
#include<fstream>
#define numar 1000005
#define R     9973

using namespace std;

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

bool a[1000005];
long long int nr_div, suma_div, suma_par;
long long int n;
int prime[100600];

void Generare_Ciur()
{
   int i, j, nr=0;
   prime[++nr] = 2;

   for (i=3; i<=numar; i=i+2)
 {   if (!a[i])
     {  prime[++nr] = i;
        for (j=i+i; j<=numar; j=j+i)
            a[j]=1;
     }
 }

}

long long int Ridicare(long long int p, long long int n)
{
   long long int x = 1;
   while (n>0)
    {
       if (n & 1 == 1)
       {   n--;
           x=((x%R)*(p%R))%R;
       }

       n >>= 1;
       p=((p%R)*(p%R))%R;

    }
   return x;
}

void Descompunere(long long int n)
{
    long long int i, j, d, k;
    long long int x, y;
    i = 1;
    nr_div = 1; suma_div = 1;
    while (n>1 && prime[i]*prime[i] <= n)
    {
       d = prime[i];
       if (n%d == 0)
       {
          k = 0;
          while (n%d == 0)
          {
            n = n/d;
            k++;
          }

          nr_div *= (k+1);
          x = Ridicare(d, k+1) - 1;
          if (x == -1) x += R;
          y = Ridicare(d-1, R-2);

          suma_par = (x*y) % R;
          suma_div = (suma_div * suma_par) % R;
       }
       i++;
    }

    if (n!=1)
    {
       /// mi-a mai ramas un factor prim tot in n
          nr_div *= 2;
          x = Ridicare(n, 2) - 1;
          if (x == -1) x += R;
          y = Ridicare(n-1, R-2);

          suma_par = (x*y) % R;
          suma_div = (suma_div * suma_par) % R;
    }

    fout << nr_div << " " << suma_div;
}

int main ()
{
  int i, T;
  fin >> T;
  Generare_Ciur();
   for (i=1; i<=T; i++)
  {
     fin >> n;
     Descompunere(n);
     fout << "\n";
  }

  fin.close();
  fout.close();
  return 0;
}