Cod sursa(job #1609377)

Utilizator robert.stefanRobert Stefan robert.stefan Data 22 februarie 2016 19:23:18
Problema Suma si numarul divizorilor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.82 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];

    prime [++ k] = 2;

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

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

inline long long power0 (int aa, int bb){
    long long rez = 1, a = 1LL * aa, b = 1LL * bb;

    while (b){
        if (b % 2)
           rez = rez * a,
           -- b;
        else
            a = a * a,
            b = b / 2;
    }
    return rez;
}

long long power (long long 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;
    long long sum = 1, p;
    for (i = 1; 1LL * prime[i] * prime[i] <= nr; ++ i){

        if (nr % prime[i] == 0){
            c = 0;
            while (nr % prime[i] == 0){
                ++ c;
                nr /= prime[i];
            }

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

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

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

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;
}