Cod sursa(job #2335114)

Utilizator lucametehauDart Monkey lucametehau Data 3 februarie 2019 16:48:43
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int MOD = 9973;
const int INF = 1e6;

int t;
long long n;

int low[1000005];
vector <int> p;

int P(int n, int p) {
  int sol = 1, x = n;
  for(; p; p >>= 1) {
    if(p & 1)
      sol = 1LL * sol * x % MOD;
    x = 1LL * x * x % MOD;
  }
  return sol;
}

int main() {
  cin >> t;
  low[2] = low[4] = 2; p.push_back(2);
  for(int i = 3; i <= INF; i += 2) {
    if(!low[i]) {
      low[i] = i;
      p.push_back(i);
    }
    for(int j = 0; j < p.size() && p[j] <= low[i] && 1LL * i * p[j] <= n; j++)
      low[i * p[j]] = p[j];
  }
  for(; t; t--) {
    cin >> n;
    int nd = 1, sd = 1;
    for(int i = 0; 1LL * p[i] * p[i] <= n && i < p.size(); i++) {
      if(n % p[i] == 0) {
        int e = 1;
        while(n % p[i] == 0)
          n /= p[i], e++;
        nd *= e;
        sd *= P(p[i], e) - 1; sd %= MOD;
        sd *= P(p[i] - 1, MOD - 2); sd %= MOD;
      }
    }
    if(n > 1) {
      nd *= 2;
      sd = 1LL * sd * (n + 1) % MOD;
    }
    cout << nd << " " << sd << "\n";
  }
  return 0;
}