Cod sursa(job #2831864)

Utilizator Chris.sCristian Chris.s Data 12 ianuarie 2022 12:22:05
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

const int MOD = 9973;

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

int ridicareputere(int nr, int exp)
{
      int r = 1;
      while(exp)
      {
            if(exp % 2 == 1)
                  r = r * nr;
            nr = nr * nr;
            exp = exp / 2;
      }

      return r;
}

int nr_div(int n)
{
      int d = 2, exp = 0, nrd = 1;
      while(n != 1)
      {
            exp = 0;
            while(n % d == 0)
            {
                  exp++;
                  n = n / d;
            }

            if(exp)
                  nrd *= exp + 1;
            
            if(d == 2)
                  d++;
            else  
                  d += 2;

            if (d * d > n)
			d = n;
      }

      return nrd % MOD;
}

int sum_div(int n)
{
      int exp = 0, sum_div = 1, d = 2;

      while(n != 1)
      {
            exp = 0;
            while(n % d == 0)
            {
                  exp++;
                  n = n / d;
            }

            if(exp)
                  sum_div *= (ridicareputere(d, exp + 1) - 1) / (d - 1);
            
            if(d == 2)
                  d++;
            else
                  d += 2;
            
            if(d * d > n)
                  d = n;
      }

      return sum_div % MOD;
}

int main()
{
      int n, a;
      fin >> n;
      for(int i = 1; i <= n; ++i)   
            {
                  fin >> a;
                  fout << nr_div(a) << " " << sum_div(a) << '\n';
            }
      return 0;
}