Cod sursa(job #1528366)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 19 noiembrie 2015 16:03:58
Problema Suma si numarul divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
# include <bits/stdc++.h>
# define MOD 9973

using namespace std;

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

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

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

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

    int cN = 0;
    sum = 1;
    long long nr = x;
    while (x != 1 && cN <= N && prim[cN] <= sqrt(nr * 1.0)) {
        EXP = 0;
        cN++;
        while (x % prim[cN] == 0){
            x /= prim[cN];
            EXP++;
        }
        nrdiv = nrdiv*(EXP + 1);
        EXP++;
        sum *= 1LL* res(prim[cN]);
        sum %= MOD;
    }
}

int main ()

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

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

    ciur();

    for (int i = 1; i <= n; i++) {
        scanf("%lld\n", &x);
        sum = 1;
        nrdiv = 1;
        if (x <= 1000005 && ok[x] == true)
        {
            printf("2 %lld\n", (x + 1) % MOD);
            continue;
        }
        T(x);
        printf("%lld %lld\n", nrdiv, sum);
    }

    return 0;
}