Cod sursa(job #1025895)

Utilizator danny794Dan Danaila danny794 Data 10 noiembrie 2013 19:10:00
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <iostream>
#include <map>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

map<long long, int> getPrimeDecomposition(long long N){
	map<long long, int> result;
	long long k;
	int pow;
	pair<long long, int> p;
	for (k = 2; k <= N; k++){
		pow = 0;
		while (N % k == 0){
			N = N / k;
			pow++;
		}

		if (pow > 0){
			p.first = k;
			p.second = pow;
			result.insert(p);
		}
	}
	return result;
}

long long getDivisorSum(map<long long, int> primeDiviors){
	map<long long, int> :: iterator it;
	long long result = 1, p;
	int pow, prime;
	for (it = primeDiviors.begin(); it != primeDiviors.end(); it++){
		prime = it -> first;
		pow	= it -> second;
		p = 1;
		long long sum = 0;
		for (int i = 0; i <= pow; i++){
			sum+=p;
			p*=prime;
		}
		result*=sum;
	}
	return result;
}

int getNumberOfDivisors(map<long long, int> primeDivisors){
	map<long long, int> :: iterator it;
	int n = 1;
	for (it = primeDivisors.begin(); it != primeDivisors.end(); it++){
		n*=(1 + it -> second);
	}

	return n;
}

void solve(long long N){
	map<long long, int> result = getPrimeDecomposition(N);
	int numberDivisors = getNumberOfDivisors(result);
	long long divisorSum = getDivisorSum(result);
	g << numberDivisors << " " << divisorSum % 9973 << "\n";
}

int main() {
	int t;
	long long N;
	f >> t;
	for (int i = 1; i <= t; i++){
		f >> N;
		solve(N);
	}
	f.close();
	g.close();
	return 0;
}