Cod sursa(job #2441605)

Utilizator AlexNeaguAlexandru AlexNeagu Data 20 iulie 2019 17:57:11
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#define nmax 1000005
#define moduletz 9973
using namespace std;
ifstream cin ("ssnd.in");
ofstream cout("ssnd.out");
int p[nmax]; bool ciur[nmax];
long long n, k = 0;
void sieve() {

    for (int i = 4; i <= nmax; i += 2)
        ciur[i] = true;
        p[++k] = 2;
    for (int i = 3; i <= nmax; i += 2) {
        if (!ciur[i]) {
            p[++k] = i;
            for (int j = i + i; j <= nmax; j += i)
                ciur[j] = true;
        }
    }
}
inline int log_pow(int baza, int exponent) {
    int result = 1;
    baza %= moduletz;
    for (; exponent; exponent >>= 1) {
        if (exponent & 1) {
            result *= baza;
            result %= moduletz;
        }
        baza *= baza;
        baza %= moduletz;
    }
    return result;
}
void invers_modular(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1;
        y = 0;
    }
    else {
        int x0, y0;
        invers_modular(b, a % b, x0, y0);
        x = y0;
        y = x0 - (a / b) * y0;
    }
}
void solve(long long number) {
    int nr_d = 1, sum_d = 1;
    for (int i = 1; i <= k && p[i] * p[i] <= number; i++) {
        if (number % p[i] == 0) {
            int pi = 0;
            while (number % p[i] == 0) {
                number /= p[i];
                pi++;
            }
                    nr_d *= (pi + 1);
                    int numarator, invers_numitor, xx;
                    numarator = (log_pow(p[i], pi + 1) - 1) % moduletz;
                    //cout << numarator << "\n";
                    invers_modular(p[i] - 1, moduletz, invers_numitor, xx);
                    //cout << p[i] - 1 << " " << invers_numitor << "\n";
                    if (invers_numitor < 0) invers_numitor = moduletz + invers_numitor % moduletz;
                    sum_d = (((sum_d * numarator) % moduletz) * invers_numitor) % moduletz;
         }
    }
  if (number > 1) {
    nr_d *= 2;
    sum_d = (1ll * sum_d * (number + 1) % moduletz);
  }
  cout << nr_d << " " << sum_d << "\n";
}
int main() {
    sieve();
    int t;
    cin >> t;
    while (t--) {
    cin >> n;
    solve(n);
    }
}