Cod sursa(job #650047)

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

using namespace std;
int n;
bitset <1000000> bit;
vector <int> ciur;

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

int pow(int x, int n) {
	int 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() {
	int i, j, x, divizor, nrDivizori, exponent;
	long long sumaDivizori;
	
	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("%d", &x);
		nrDivizori = 1, sumaDivizori = 1, j = 0, divizor = ciur[j++];
		
		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;
}