Cod sursa(job #921782)

Utilizator fhandreiAndrei Hareza fhandrei Data 21 martie 2013 13:33:24
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
// Include
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

// Definitii
#define pb push_back
#define ll long long

// Constante
const int mod = 9973;

// Functii
void erath();
ll POW(int nr, int power);

// Variabile
ifstream in("ssnd.in");
ofstream out("ssnd.out");

int tests;
vector<int> primes;

// Main
int main()
{
	
	erath();
	in >> tests;
	vector<int>::iterator primeIT, primeBEGIN=primes.begin(), primeEND = primes.end();
	while(tests--)
	{
		ll num;
		in >> num;
		
		int divNum=1;
		ll divSum=1;
		for(primeIT=primeBEGIN ; 1LL*(*primeIT)*(*primeIT)<=num ; ++primeIT)
		{
			int divPower = 0;
			while(!(num % *primeIT))
			{
				++divPower;
				num /= *primeIT;
			}
			if(divPower)
			{
				divNum *= divPower+1;
				divSum *= (POW(*primeIT, divPower+1) - 1) / (*primeIT - 1);
			}
		}
		if(num != 1)
		{
			divNum *= 2;
			divSum *= (POW(num, 2) - 1) / (num - 1);
		}
		out << divNum << ' ' << divSum%mod << '\n';
	}
	
	in.close();
	out.close();
	return 0;
}

void erath()
{
	primes.reserve(78495);
	primes.pb(2);
	bitset<(int)1e6+2> isPrime;
	isPrime.flip();
	int limit = (int)1e6;
	for(int i=3 ; i<limit ; i+=2)
	{
		if(isPrime[i])
		{
			for(int j=i*i ; j<limit && j>0 ; j+=i)
				isPrime[j] = false;
			primes.pb(i);
		}
	}
	primes.pb(0);
}

ll POW(int nr, int power)
{
	ll answer = 1, num = nr;
	
	for(int i=0 ; (1<<i)<=power ; ++i)
	{
		if((1<<i)&power)
			answer *= num;
		num *= num;
	}
	return answer;
}