Cod sursa(job #3314764)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 11 octombrie 2025 03:14:35
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

#define i16 int16_t
#define i32 int32_t
#define i64 int64_t

#define GUARD(expr) \
  do {              \
    if (!(expr)) {  \
      return 1;     \
    }               \
  } while (0)

constexpr i32 MAX = 1'000'000;

static_assert(i64(MAX) * MAX == INT64_C(1'000'000'000'000));

constexpr i16 MOD = 9'973;

pair<i32, i32> solve(i64 n, const vector<i32>& primes,
                     const array<i32, MOD>& inverse) {
  vector<pair<i32, i16>> k;
  for (i32 p : primes) {
    if (!(n % p)) {
      i16 e{1};
      for (n /= p; n % p == 0; n /= p) {
        ++e;
      }
      k.emplace_back(p, e);
    }
  }
  if (n > 1) {
    k.emplace_back(n, 1);
  }
  i32 c{1};
  i32 s{1};
  auto exp = [](i32 p, i16 e) {
    i32 x{1};
    p %= MOD;
    for (; e;) {
      if (e & 1) {
        x = (x * p) % MOD;
      }
      p = (p * p) % MOD;
      e >>= 1;
    }
    return x;
  };
  for (auto [p, e] : k) {
    s = (s *
         (((exp(p, e + 1) - 1 + MOD) % MOD) * inverse[(p - 1) % MOD] % MOD)) %
        MOD;
    c = (c * (e + 1)) % MOD;
  }
  return {c, s};
}

int main() {
  array<i32, MOD> inverse{};
  inverse[1] = 1;
  for (int i = 2; i < MOD; ++i) {
    inverse[i] = (MOD - (MOD / i) * inverse[MOD % i] % MOD) % MOD;
  }
  bitset<MAX + 1> sieve{};
  sieve[0] = sieve[1] = 1;
  for (i64 p = 2; p * p <= MAX; ++p) {
    if (!sieve[p]) {
      for (i64 q = p * p; q <= MAX; q += p) {
        sieve[q] = 1;
      }
    }
  }
  vector<i32> primes{};
  for (i32 i = 2; i <= MAX; ++i) {
    if (!sieve[i]) {
      primes.push_back(i);
    }
  }
#ifndef LOCAL
  freopen("ssnd.in", "r", stdin);
  freopen("ssnd.out", "w", stdout);
#endif
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  i64 T;
  GUARD(cin >> T && 1 <= T && T <= 1'000);
  for (; T--;) {
    i64 N;
    GUARD(cin >> N && 1 <= N && N <= 1'000'000'000'000);
    auto [c, s] = solve(N, primes, inverse);
    cout << c << ' ' << s << '\n';
  }
  return 0;
}