Cod sursa(job #764780)

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

#include <stdio.h>
#include <stdlib.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 + i; j < MAXN; j += i << 1) 
                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) {
        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;
}