Cod sursa(job #764768)

Utilizator ioana26Ioana Andronescu ioana26 Data 6 iulie 2012 11:41:11
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
/*
Suma si numarul de divizori. 
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define MAXN    1000000
#define MOD		9973

int t;
int factor_prim[MAXN];
bool prim[MAXN];

void ciur_eratostene () {
    int i, j;
	int k = 0;

	for (i = 2; i < MAXN; i++)
		prim[i] = 0;

    for (i = 2; i < MAXN; i++) {
        if (!prim[i])
            factor_prim[++k] = i;
        for (j = i + i; j < MAXN; j += i) 
            prim[j] = 1;
    }
}

void sum_div (long long n) {
  	long long sum_div = 1, nr_div = 1;
    long long d, p;
    int i = 1;

    while ((factor_prim[i] * factor_prim[i] <= n) && (n > 1)) {
        if (!(n % factor_prim[i])) {
            p = factor_prim[i];
            d = 0;
            while (!(n % factor_prim[i])) {
                d++;
                p *= factor_prim[i];
                n /= factor_prim[i];
            }
            nr_div *= (d + 1);
            sum_div = (sum_div * (p - 1) / (factor_prim[i] - 1)) % MOD;
        }
        i++;
    }
    if (n > 1) {
        nr_div *= 2;
        sum_div = (sum_div * (n * n - 1) / (n - 1)) % MOD;
    }
    printf("%lld %lld\n", nr_div, sum_div);
}

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

    long long n;
    int i;

    scanf("%d", &t);
    ciur_eratostene();
    for (i = 0; i < t; i++) {
        scanf("%lld", &n);
        sum_div(n);
    }

    return 0;
}