Cod sursa(job #650061)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 17 decembrie 2011 12:19:15
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<cstdio>
#include<cmath>
#include<vector>
#define MOD 9973

using namespace std;
long long  n;
vector <bool> bit;
vector <int> ciur;

void Eratostene() {
	int i, j;
	
	bit.assign(1000001, 1);
	for(i = 2; i <= 1000000; i++)
		if(bit[i] == 1) {
			ciur.push_back(i);
			for(j = 2 * i; j <= 1000000; j += i) 
				bit[j] = 0;
		}
}

long long Pow(long long x, long long n) {
	long long y;
	
	if(n == 1) return x;
	if(n % 2 == 1) return x * Pow(x, n - 1);
	
	y = Pow(x, n / 2);
	return y * y;
}

int main() {
	long long i, j, nrDivizori, exponent, sumaDivizori, x, divizor;
	
	freopen("ssnd.in", "r", stdin), freopen("ssnd.out", "w", stdout);
	Eratostene(); // calculez numerele prime cu Ciurul lui Eratostene
	scanf("%d", &n); 
	
	for(i = 1; i <= n; i++) {
		scanf("%lld", &x);
		nrDivizori = 1, sumaDivizori = 1, j = 0, divizor = ciur[j++];
		
		// descompunere in factori primi
		while(x != 1 && divizor <= sqrt(x)) {
			exponent = 0;
			
			if(x % divizor == 0) {
				while(x % divizor == 0) {
					x /= divizor;
					exponent++;
				}
				
				sumaDivizori = sumaDivizori * (Pow(divizor, exponent + 1) - 1) / (divizor - 1) % MOD;
				nrDivizori *= (exponent + 1);
			}
			
			divizor = ciur[j++];
		}
		
		if(x != 1) nrDivizori *= 2, sumaDivizori = sumaDivizori * (x + 1) % MOD;
		printf("%d %lld\n", nrDivizori, sumaDivizori);
	}
	
	return 0;
}