Cod sursa(job #1726700)

Utilizator elena.marinicaMarinica Elena-Georgiana elena.marinica Data 8 iulie 2016 19:00:02
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

void ssnd(int x, int primes[], int k, int &nr, int &sum) {
	
	nr = 1;
	sum = 1;
	
	int po;

	for (int i = 0; i < k; i++) {
	
		po = 0;
		
		while (x % primes[i] == 0) {
			po++;
			x = x / primes[i];
		}
		
		if (po != 0) {
			nr *= (po + 1);
			sum *= ((pow(primes[i], (po + 1)) - 1)) / (primes[i] - 1);
		}
	}
	
	
	if (x > 1) {
		nr *= 2;
		sum *= (1 + x);
	}
}

int main() {
	
	FILE *fin = fopen("ssnd.in", "r");
	FILE *fout = fopen("ssnd.out", "w");
	
	int n, x, sum, nr;
	fscanf(fin, "%d", &n);
	
	int v[n];
	
	int m = -1000000001;
	
	for (int i = 0; i < n; i++) {
		
		fscanf(fin, "%d", &x);
		v[i] = x;
		
		if (x > m) {
			m = x;
		}
		
	}
	
	int primes[(int)(sqrt(m))];
	int k = 0;
	
	bool prim[(int)(sqrt(m))];
	memset(prim, true, sizeof(bool) * (int)(sqrt(m)));
	
	for (int i = 2; i * i <= m; i++) {
		
		if (prim[i]) {
			primes[k] = i;
			k++;
		}
	
		for (int j = i * i; j * j <= m; j += i) {
			
			if (prim[j]) {
				prim[j] = false;
			}
		}
	}
	
	for (int i = 0; i < n; i++) {
		ssnd(v[i], primes, k, nr, sum);
		fprintf(fout, "%d %d\n", nr, sum);
	}
}