Cod sursa(job #2566310)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 2 martie 2020 20:27:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1000005;
const long long MOD = 9973;
bool ciur[NMAX + 10];
vector <long long> prime;
struct Chestie {
    long long fact, exp;
};
Chestie a[NMAX];
struct Curent {
    long long fact, prod;
};
queue <Curent> q;

int main() {
    int T;
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    scanf("%d", &T);
    ciur[0] = ciur[1] = 1;
    for(int j = 4; j <= NMAX; j += 2) {
        ciur[j] = 1;
    }
    for(long long i = 3; i <= NMAX; i += 2) {
        if(ciur[i] == 0) {
            for(long long j = i * i; j <= NMAX; j += (2 * i)) {
                ciur[j] = 1;
            }
        }
    }
    for(int i = 2; i <= NMAX; i++) {
        if(ciur[i] == 0) {
            prime.push_back(i);
        }
    }
    while(T > 0) {
        T--;
        long long n;
        scanf("%lld", &n);
        int top = 0;
        for(int i = 0; prime[i] * prime[i] <= n; i++) {
            Chestie nr = {0, 0};
            nr.fact = prime[i];
            while(n % prime[i] == 0) {
                n /= prime[i];
                nr.exp++;
            }
            if(nr.exp > 0) {
                a[++top] = nr;
            }
        }
        if(n > 1) {
            a[++top] = {n, 1};
        }
        q.push({1, 1});
        long long nrfact = 1;
        for(int i = 1; i <= top; i++) {
            nrfact *= (a[i].exp + 1);
            auto p = q.front();
            p.prod %= MOD;
            while(p.fact == i) {
                q.pop();
                long long inm = 1;
                for(int j = 0; j <= a[i].exp; j++) {
                    q.push({p.fact + 1, inm * p.prod});
                    inm = (inm * a[i].fact) % MOD;
                }
                p = q.front();
            }
        }
        printf("%lld ", nrfact);
        long long sol = 0;
        while(!q.empty()) {
            auto nr = q.front();
            sol = (sol + nr.prod) % MOD;
            q.pop();
        }
        printf("%lld\n", sol);
    }
    return 0;
}