Cod sursa(job #2981849)

Utilizator alexcostinCostin Alexandru alexcostin Data 18 februarie 2023 20:28:47
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 9973;

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

bitset<1000051> b;
int prime[80000], m;

void Ciur(int n) {
    int i, j;
    for (i = 3; i * i <= n; i += 2)
        if (b[i] == 0)
            for (j = i * i; j <= n; j += 2*i)
                b[j] = 1;
    m = 1;
    prime[1] = 2;
    for (i = 3; i <= n; i += 2)
        if (b[i] == 0) prime[++m] = i;
}

int QuickExpo(int a, int n) {
    int p = 1;
    while (n > 0) {
        if (n % 2 == 1)
            p = (1LL * p * a) % MOD;
        n /= 2;
        a = 1LL * a * a % MOD;
    }
    return p;
}

void DESC(long long n) {
    int sd = 1, nrd = 1, i, f, e, x;
    for (i = 1; 1LL * prime[i] * prime[i] <= n; i++) {
        f = prime[i];
        e = 0;
        while (n % f == 0) {
            e++;
            n /= f;
        }
        if (e > 0) {
            nrd = nrd * (e + 1);
            x = QuickExpo(f, e + 1) - 1;
            if (x < 0)
                x += MOD;

            x = x * QuickExpo(f - 1, MOD-2) % MOD;
            sd = sd * x % MOD;
        }
    }
    if (n > 1) {
        nrd = nrd * 2;
        x = QuickExpo(n, 2) - 1;
        if (x < 0) x += MOD;

        x = x * QuickExpo(n - 1, MOD-2) % MOD;
        sd = sd * x % MOD;
    }
    g << nrd << " " << sd << "\n";
}

int main()
{
    Ciur(1000049);
    int n;
    long long x;
    f >> n;
    while (n--) {
        f >> x;
        DESC(x);
    }
    f.close();
    g.close();
    return 0;
}