Cod sursa(job #2191490)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 2 aprilie 2018 21:36:45
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

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

const int LIM = 1e6, MOD = 9973;

int t;
long long n;

int sumDivs, numDivs;

bool c[LIM + 2];
vector<int> primes;
void ciur();

int exp(int a, int b);

int main()
{
	ciur();

	in >> t;
	while(t--)
	{
		numDivs = sumDivs = 1;

		in >> n;
		for(int i = 0; primes[i] * primes[i] <= n; i++)
		{
			int p = 0;
			while(n % primes[i] == 0)
			{
				n /= primes[i];
				p++;
			}

			numDivs = (numDivs * (p + 1)) % MOD;
			sumDivs = (sumDivs * (exp(primes[i], p + 1) - 1) * exp(primes[i] - 1, MOD - 2)) % MOD;
		}

		if(n != 1)
		{
			numDivs = (numDivs * 2) % MOD;
			sumDivs = (sumDivs * (exp(n, 2) - 1) * exp(n - 1, MOD - 2)) % MOD;
		}

		out << numDivs << ' ' << sumDivs << '\n';
	}

	return 0;
}

void ciur()
{
	c[0] = c[1] = true;
	for(int i = 4; i <= LIM; i += 2)
		c[i] = true;

	for(int i = 3; i * i <= LIM; i++)
		if(!c[i])
			for(int j = i * i; j <= LIM; j += 2 * i)
				c[j] = true;

	for(int i = 2; i <= LIM; i++)
		if(!c[i])
			primes.push_back(i);
}

int exp(int a, int b)
{
	int ans;
	for(ans = 1; b; b >>= 1)
	{
		if(b & 1)
			ans = (ans * a) % MOD;
		a = (a * a) % MOD;
	}

	return ans;
}