Cod sursa(job #1607637)

Utilizator robert.stefanRobert Stefan robert.stefan Data 21 februarie 2016 14:34:57
Problema Suma si numarul divizorilor Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>

#define IN "ssnd.in"
#define OUT "ssnd.out"
#define MAXN 1000001
#define MOD 9973

int k = 0, prime [MAXN + 5];

void eratosthenes (void) {
    int i, j;
    char seen[MAXN + 5];

    for (i = 2; i <= MAXN; ++ i)
        if (seen [i] != 1){
            seen [i] = 1;
            prime [++ k] = i;

            for (j = i + i; j <= MAXN; j += i)
                seen [j] = 1;
        }
}

int power (int a, int b){
    if (b == 0)
        return 1;
    if (b % 2)
        return a * power (a * a, b / 2);
    else
        return power (a * a, b / 2);

}

inline void solve (int nr){
    int i, c, counter = 1, sum = 1, auxNr = nr, p;

    for (i = 1; i <= k && prime[i] * prime[i] <= auxNr; ++ i){
        //printf ("%d\n", prime[i]);
        if (nr % prime[i] == 0){
            c = 0;
            while (nr % prime[i] == 0){
                ++ c;
                nr /= prime[i];
            }

            counter = (counter * ((c + 1) % MOD)) % MOD;
            p = (power (prime[i], c + 1) - 1) / (prime[i] - 1);
            sum = (sum * p % MOD) % MOD;
        }
    }

    if (nr > 1)
        counter *= 2,
        sum = (sum * ((nr * nr - 1) / (nr - 1)) % MOD) % MOD;

    printf ("%d %d", counter, sum);
    printf ("\n");
}

int main(void) {
    freopen (IN, "r", stdin);
    freopen (OUT, "w", stdout);

    eratosthenes();

    int t, nr;
    scanf ("%d", &t);

    while (t--){
        scanf ("%d", &nr);
        solve (nr);
    }

    fclose (stdin);
    fclose (stdout);
    return 0;
}