Cod sursa(job #3264705)

Utilizator Barbu_MateiBarbu Matei Barbu_Matei Data 23 decembrie 2024 14:38:37
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 9973;
long long n;
int prime[1000001], k;
bool marked[1000001];

int exp(int base, int pwr) {
    int res = 1;
    while (pwr != 0) {
        if (pwr & 1) {
            res = (res * base) % MOD;
        }
        base = (base * base) % MOD;
        pwr >>= 1;
    }
    return res;
}

int card, sum;

void pfac(long long n) {
    int m = 0;
    card = 1;
    sum = 1;
    for (int i = 1; i <= k && n != 1; ++i) {
        int pow = 0;
        while (n % prime[i] == 0) {
            ++pow;
            n /= prime[i];
        }
        if (pow != 0) {
            card = card * (pow + 1) % MOD;
            sum = sum * (exp(prime[i], pow + 1) - 1 + MOD) % MOD * exp(prime[i] - 1, MOD - 2) % MOD;
        }
    }
}

int main() {
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    int t;
    cin >> t;
    for (int i = 2; i <= 1e6; ++i) {
        if (!marked[i]) {
            prime[++k] = i;
            for (int j = i; j <= 1e6; j += i) {
                marked[j] = true;
            }
        }
    }
    while (t--) {
        cin >> n;
        pfac(n);
        cout << card << " " << sum << "\n";
    }
}