Cod sursa(job #2271793)

Utilizator theo2003Theodor Negrescu theo2003 Data 29 octombrie 2018 11:12:19
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
int main() {
	vector<int> primes;
	{
		bitset<1000000> prime;
		prime[0] = true;
		prime[1] = true;

		for(int x = 4; x<1000000; x+=2)
			prime[x] = true;

		for(int x = 3; x<=1000; x+=2) {
			if(!prime[x])
				for(int y = x + x; y<1000000; y+=x)
					prime[y] = true;
		}

		for(int x = 2; x<1000000; x++) {
			if(!prime[x])
				primes.push_back(x);
		}
	}
	int n;
	in>>n;

	for(int x1 = 0, nr; x1<n; x1++) {
		in>>nr;
		vector<pair<int, int> > div;
		int lim = sqrt(nr);

		for(unsigned int x = 0; (x<primes.size())&&(primes[x]<=lim)&&(primes[x]<=nr); x++) {
			if((nr%primes[x])==0)
				div.push_back(pair<int, int>(primes[x], 0));
			else
				continue;

			while((nr%primes[x])==0) {
				nr/=primes[x];
				div.back().second++;
			}
		}

		if(!div.size()) {
			out<<2<<' '<<nr+1<<'\n';
			continue;
		}

		long long int card = 1;
		long long int sum = 1;

		for(pair<int, int> div_ : div) {
			card*=div_.second + 1;
			sum*=(pow(div_.first, div_.second + 1) - 1)/(div_.first - 1);
		}

		out<<card<<' '<<sum<<'\n';
	}
}