Cod sursa(job #1527601)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 18 noiembrie 2015 14:20:21
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
# include <bits/stdc++.h>

using namespace std;

bool ok[1000000 + 5];
int prim[500000 + 5], N, n, x;
long long EXP, nrdiv, sum;

void ciur() {
    int i, j;
    for (i = 2; i * i <= 1000000; ++i) ok[i] = true;

    for (i = 2; i * i <= 1000000; ++i)
        if (ok[i] == true)
            for (j = 2 * i; j * j <= 1000000; j += i)
                ok[j] = false;

    for (i = 1; i * i <= 1000000; ++i)
        if (ok[i] == true) prim[++N] = i;
}
int res(int N){
    int nr = N, cEXP = EXP;
    while (cEXP > 1) {
        nr *= N;
        cEXP--;
    }
    return ( (nr - 1) / (N - 1) );
}
void T(int x) {

    int cN = 0;
    sum = 1;
    while (x != 1) {
        EXP = 0;
        cN++;
        while (x % prim[cN] == 0){
            x /= prim[cN];
            EXP++;
        }
        nrdiv = nrdiv*(EXP + 1);
        EXP++;
        sum *= 1LL* res(prim[cN]);
    }
}

int main ()

{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);

    scanf("%d\n", &n);

    ciur();

    for (int i = 1; i <= n; i++) {
        scanf("%d\n", &x);
        sum = 1;
        nrdiv = 1;
        T(x);
        printf("%lld %lld\n", nrdiv, sum);
    }

    return 0;
}