Cod sursa(job #3149909)

Utilizator alex210046Bratu Alexandru alex210046 Data 13 septembrie 2023 16:04:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int NMAX = 1000000;
const int MOD = 9973;
bool prim[1000001];
vector<int> ciur;

void eratostene() {
    prim[0] = prim[1] = 1;
    for(int d = 2; d <= NMAX; d++)
        if(!prim[d]) {
            for(int j = d * 2; j <= NMAX; j += d)
                prim[j] = 1;
            ciur.push_back(d);
        }
}

int lgPow(int x, int p) {
    int v = 1;
    while(p > 0) {
        if(p & 1)
            v = 1LL *  v * x % MOD;
        x = 1LL * x * x % MOD;
        p >>= 1;
    }
    return v;
}

inline int invMod(int n) {
    return lgPow(n, MOD - 2);
}

void desc(long long x) {
    long long nr = 1, s = 1;
    for(int d : ciur)
        if(x % d == 0) {
            if(1LL * d * d > x) break;
            int p = 0;
            while (x % d == 0) {
                p++; x /= d;
            }
            nr *= p + 1;
            s = (1LL * s * (lgPow(d, p + 1) - 1) % MOD) * invMod(d - 1) % MOD;
        }
    if (x > 1) {
        nr *= 2;
        s = 1LL * s * (x + 1) % MOD;
    }
    g << nr << ' ' << s << '\n';
}

int main() {
    eratostene();
    int t; f >> t;
    while (t--) {
        long long x;
        f >> x;
        desc(x);
    }

    return 0;
}