Cod sursa(job #1730511)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 16 iulie 2016 23:43:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

#define maxciur 1000005
//#define mod 9973

vector<long long> prime(maxciur);

int t;
long long n;
int nrp = 0;

void ciur (){
	bitset<maxciur> sieve(maxciur);
	sieve.set();
	for (int i = 2; i <= maxciur; i++)
	{
		if (sieve[i])
		{
			prime[nrp] = i;
			++nrp;
			for (int j = i; j <= maxciur; j = j+i)
			{
				sieve[j] = 0;
			}
		}
	}
}

/*pair<int,int> sumadiv(long long n)
{
	int card = 1;
	int sumdiv = 1;
	int mod = 9973;
	//cout<<n << " ";
	for (int i = 0; 1LL * prime[i] * prime[i] <= n && i < prime.size(); ++i)
	{
		if (n % prime[i] != 0)
			continue;
		int power = 0;
		//int copyn = n;
		long long aux = prime[i];
		while (n % prime[i] == 0)
		{
			aux *= prime[i];//%mod;
			++power;
			n = n/prime[i];
		}
		card = (card*(power+1)) % mod;
		//aux = (aux*prime[i]) % mod;
		sumdiv =  (sumdiv * (aux - 1LL)/(prime[i]-1LL)) % mod;
		//sumdiv *= aux;
		//sumdiv %= mod;
	}
	if (n != 1)
	{
		//card *= 2;
		card = (card * 2) % mod;
		sumdiv = (sumdiv * (n+1))%mod;
	}
	//cout<<n<<endl;
	return make_pair(card, sumdiv);
}*/

int main()
{
	ciur();
	fin >>t;
	while (t != 0)
	{
		fin>>n;
		//cout<<t<<endl;
		int card = 1;
		int sumdiv = 1;
		int mod = 9973;
		//cout<<n << " ";
		for (int i = 0; prime[i] * prime[i] <= n && i < nrp; ++i)
		{
			if (n % prime[i] != 0)
				continue;
			int power = 0;
			//int copyn = n;
			long long aux = prime[i];
			while (n % prime[i] == 0)
			{
				aux *= prime[i];//%mod;
				++power;
				n = n/prime[i];
			}
			card = (card*(power+1)) % mod;
			//aux = (aux*prime[i]) % mod;
			sumdiv =  (sumdiv * (aux - 1LL)/(prime[i]-1LL)) % mod;
			//sumdiv *= aux;
			//sumdiv %= mod;
		}
		if (n != 1)
		{
			//card *= 2;
			card = (card * 2) % mod;
			sumdiv = (sumdiv * (n+1))%mod;
		}
		fout<<card<<' '<<sumdiv<<'\n';
		//pair<int,int> newp = sumadiv(n);
		//fout<<newp.first<<" "<<newp.second<<"\n";
		--t;
	}
}