Cod sursa(job #2431329)

Utilizator SmokeCiocotisan Cosmin Smoke Data 18 iunie 2019 22:40:38
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>


using namespace std;
const int p = 9973;
   ofstream out("ssnd.out");

   struct date{
      unsigned apar ,el;
   };


   unsigned ridica(unsigned x, unsigned y)
   {

       unsigned r = 1;
       while(y)
       {
           if(y % 2 == 1) r=r*x;
           x = x*x;
           y/=2;

       }
       return r;

   }

   unsigned det_nr_div(date  *div  , unsigned lg)
   {
       unsigned prod = 1;
       for(unsigned i = 0 ; i<lg ; i++)
            prod *= (div[i].apar +1);


            return prod;

   }

   unsigned det_suma_div(date *div, unsigned lg)
   {
       unsigned elem =0 , prod = 1;

      for(unsigned  i  = 0 ; i < lg ;i++)
      {
          elem = (ridica(div[i].el ,div[i].apar + 1)  - 1) /(div[i].el - 1);
          prod*=(elem % p);
      }

       return prod % p;

   }
   void find_div(unsigned long x)
   {

       date div[100];
       unsigned lg_d = 0,apar = 0;
       unsigned long d =2;

       while(x != 1)
       {
            while(x%d != 0) d++;

       apar = 0;
       while(x && x%d == 0)
       {
           x/=d;
           apar++;

       }
           div[lg_d].apar =  apar;
           div[lg_d++].el = d;
       }
     unsigned nr_div= det_nr_div(div,lg_d) , sum = det_suma_div(div, lg_d);

      out<<nr_div<<' '<<sum<<'\n';




   }
int main()
{
    ifstream in("ssnd.in");


    unsigned long x,t;

  in>>t;

  for(unsigned i = 0 ; i < t ;i++)
  {
      in>>x;
      find_div(x);
  }


    return 0;
}