Cod sursa(job #710523)

Utilizator sana1987Laurentiu Dascalu sana1987 Data 9 martie 2012 20:58:02
Problema Suma si numarul divizorilor Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#include <string.h>

#define MOD 9973

int p[1000000];
int d[1000000];
int ndiv;

void prime_factors(long n) {
    int aux = 2;

    while (n > 1) {
        if (n % aux == 0) {
            p[ndiv] = aux;
            d[ndiv]++;
            n /= aux;
        }
        else {
            if (d[ndiv] > 0)
                ndiv++;
            aux++;
        }
    }
    if (d[ndiv] > 0)
        ndiv++;
}

int putere(int p, int d) {
    int i, x = 1;
    for (i=0;(1<<i)<=d;i++) {
        if (((1 << i) & d)) {
            x = (x * p) % MOD;
        }
        p = (p * p) % MOD;
    }
    return x;
}

int main(int argc, char **argv) {
    int m;
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    memset(d, 0, sizeof(d));
    ndiv = 0;

    scanf("%d", &m);
    int j, n;

    for (j = 0; j < m; j++) {
        scanf("%d", &n);

        ndiv = 0;
        prime_factors(n);

        long ndivs = 1, sums = 1;

        //printf("ndiv = %d\n", ndiv);
        //for (i=0;i<ndiv;i++) {
        //    printf("%d %d\n", d[i], p[i]);
        //}

        int i;
        for (i=0;i<ndiv;i++) {
            ndivs = (ndivs * 1LL * (d[i] + 1)) % MOD;
            sums = (sums * 1LL * ((putere(p[i], d[i] + 1) - 1) / (p[i] - 1))) % MOD;
            p[i] = d[i] = 0;
        }
        printf("%ld %ld\n", ndivs, sums);
    }

	return 0;
}