Cod sursa(job #1581803)

Utilizator Burbon13Burbon13 Burbon13 Data 27 ianuarie 2016 10:15:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>

using namespace std;

const int mxprim = 80000;
const int mxp10 = 1000000;
const int mod = 9973;

int n,prime[mxprim],nd,sd;
long long nr;
bool viz[mxp10+3];

void ciur() {
    prime[++prime[0]] = 2;
    for(int i = 3; i <= mxp10; i += 2)
        if(not viz[i]) {
            prime[++prime[0]] = i;
            for(int j = i + i; j <= mxp10; j += i)
                viz[j] = true;
        }
}

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

    ciur();

    scanf("%d", &n);
    while(n--) {
        nd = sd = 1;
        scanf("%lld", &nr);
        for(int i = 1; i <= prime[0] && 1LL * prime[i] * prime[i] <= nr; ++i)
            if(nr % prime[i] == 0) {
                int p = 0;
                while(nr % prime[i] == 0){
                    ++ p;
                    nr /= prime[i];
                }
                nd = (nd * (p + 1)) % mod;

                int ad = 1, inm = 1;
                for(int j = 1; j <= p; ++j){
                    inm = (1LL * inm * prime[i]) % mod;
                    ad += inm;
                }

                sd = (1LL * sd * ad) % mod;

            }
        if(nr > 1){
            nd = (nd * 2) % mod;
            /// why this?
            sd = (1LL * sd * (nr + 1)) % mod;
        }
        printf("%d %d\n", nd, sd);
    }

    return 0;
}