Cod sursa(job #1730393)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 16 iulie 2016 21:05:36
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define maxciur 1000000
#define mod 9973

vector<int> prime;

int t;
long long n;

void ciur (){
	vector<int> sieve(maxciur, 1);
	for (int i = 2; i <= maxciur; i++)
	{
		if (sieve[i])
		{
			prime.push_back(i);
			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;
	//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 = 1;
		while (n % prime[i] == 0)
		{
			aux *= prime[i];//%mod;
			++power;
			n = n/prime[i];
		}
		card = (card*(power+1)) % mod;
		aux = (aux*prime[i]) % mod;
		aux -= 1LL;
		aux /= (prime[i]-1LL);
		aux = aux%mod;
		sumdiv *= aux;
		//sumdiv %= mod;
	}
	if (n != 1)
	{
		card *= 2;
		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;
		pair<int,int> newp = sumadiv(n);
		fout<<newp.first<<" "<<newp.second<<"\n";
		--t;
	}
}