Cod sursa(job #1607641)

Utilizator robert.stefanRobert Stefan robert.stefan Data 21 februarie 2016 14:44:17
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.57 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 (long long nr){
    int  i, c, counter = 1, sum = 1, p;
    long long auxNr = nr;
    for (i = 1; i <= k && prime[i] * prime[i] <= auxNr; ++ 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;
    long long nr;
    scanf ("%d", &t);

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

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