Cod sursa(job #2271822)

Utilizator theo2003Theodor Negrescu theo2003 Data 29 octombrie 2018 11:45:20
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 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(long long int x1 = 0, nr; x1<n; x1++) {
		in>>nr;
		vector<pair<long long int, int> > div;
		long long int lim = nr/2;

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

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

		if(nr>1)
			div.push_back(pair<long long int, int>(nr, 1));

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

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

		for(pair<long long int, int> div_ : div) {
		//	out<<div_.first<<' '<<div_.second<<'\n';
			card*=div_.second + 1;
			double tmp = (pow(div_.first, div_.second + 1) - 1)/(div_.first - 1);
			sum*=tmp;
			sum%=9973;
		}

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