Cod sursa(job #2078633)

Utilizator alina13mAlinaaa alina13m Data 29 noiembrie 2017 19:35:25
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <math.h>

// suma si numarul divizorilor

std :: ifstream cin("ssnd.in");
std :: ofstream cout ("ssnd.out");

#define NMAX 1000
#define Modulo 9973
int64_t n, a, allNumbers[NMAX], primeNrs[NMAX], count = 1, sum, j, nrPrime, exponent, result, total;
char A[NMAX];

//cout.flush;

void ciur(int64_t n) {

	for(int64_t i = 2; i <= sqrt(n); i++) {
    	if(A[i] == 0){
      		  
      		for(int64_t j = i * i; j <= n; j += i) {
        		A[j] = 1; 
        		
      		}
    	}
	}

  	for(int64_t i = 2; i <= n; i++) {
    	// Check if it was marked as prime number and if yes, store it in the array primeNrs.
    	if(A[i] == 0 && primeNrs[i] != n){  
    		primeNrs[++nrPrime] = i;
    	}
  	}


}

/*  n = p1^a1 * p2*a2 * p3^a3 atunci
	divizori = (a1 + 1) * (a2 + 1) * (a3 + 1);
*/
void sumaDivizori(int64_t n){

	int64_t divizori = 1, sum = 1, firstItem = 1, imparte = 1, otherItems, partialSum = 1;

	for(int64_t i = 1; i <= nrPrime; i++) {
		
		otherItems = primeNrs[i];

		while(n % primeNrs[i] == 0){
			n /= primeNrs[i];
			exponent++;

			partialSum += otherItems; 
			otherItems *= primeNrs[i]; // 2 + 4 + 8  eg n = 8

		}

		if(exponent != 0){
			divizori *= (exponent + 1);
		}
			
		sum *= partialSum;
		partialSum = 1;
		exponent = 0;

	}

	cout << divizori << " " << sum << "\n";
}


int main() {

	
	cin >> total;
	
	while(total--){
		cin >> n;
		ciur(n);
		sumaDivizori(n);
	}

	return 0;
}