Cod sursa(job #1847821)

Utilizator alexnekiNechifor Alexandru alexneki Data 15 ianuarie 2017 03:37:31
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cassert>

using namespace std;

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

int const radmax = 1000001;
int const nmax = 1001;
int const modulo = 9973;

int ciur[radmax]; //ciur[i] == true <=> composed number
int nfactor, power[nmax];
long long factor[nmax];

void computeciur() {
  ciur[0] = ciur[1] = 1;
  ciur[2] = ciur[3] = 0;
  for (int i = 4; i < radmax; i += 2) {
    ciur[i] = 1;
  }
  for (int i = 5; i < radmax; i += 2) {
    if (ciur[i] == 0) {
      long long j = ((long long) i) * i;
      while (j < radmax) {
        ciur[j] = 1;
        j += i;
      }
    }
  }
}

void decompose(long long n) {
  nfactor = 0;
  long lim = sqrt(n);
  for (int i = 2; i <= lim; i++) {
    if (ciur[i] == 0 && n % i == 0) {
      factor[nfactor] = i;
      int npow = 0;
      while (n % i == 0) {
        npow++;
        n = n / i;
      }
      power[nfactor] = npow;
      nfactor++;
    }
  }
  if (1 < n) {
    factor[nfactor] = n;
    power[nfactor] = 1;
    nfactor++;
  }

  for (int i = 0; i < nfactor; i++) {
    factor[i] = factor[i] % modulo;
  }
  //debug
//  for (int i = 0; i < nfactor; i++) {
//    cout << factor[i] << "^" << power[i] << endl;
//  }
}

int effpower(int a, int b) {
//  cout << a << " " << b << " -> ";
  if (b == 0)
    return 1;
  else if (b == 1)
    return a;
  else if ((b & 1) == 0) {
    int result = effpower(a, b >> 1);
//    cout << a << " " << b << " " << result << endl;
    return (result * result) % modulo;
  } else {
    int result = effpower(a, b >> 1);
    return (((result * result) % modulo) * a) % modulo;
  }
}

long long numdiv(long long n) {
  long long result = 1;
  for (int i = 0; i < nfactor; i++) {
    result *= (power[i] + 1);
  }
  return result;
}

int sumdiv(long long n) {
  int sd = 1;
  for (int i = 0; i < nfactor; i++) {
    int modif1 = (effpower(factor[i], power[i] + 1) + modulo - 1) % modulo;
    int modif2 = effpower(factor[i] - 1, modulo - 2);
    sd = (sd * modif1) % modulo;
    sd = (sd * modif2) % modulo;
//    cout << effpower(factor[i], power[i] + 1) << " " << modif1 << " " << modif2 << " " << sd << endl;
  }
  return sd;
}

int main() {
//  cout << effpower(2, 4) << endl;
  computeciur();

  int t;
  in >> t;
  for (int i = 0; i < t; i++) {
    long long n;
    in >> n;
    decompose(n);
    long long nd = numdiv(n);
    int sd = sumdiv(n);
    out << nd << " " << sd << endl;
  }
  return 0;
}