Cod sursa(job #1336759)

Utilizator andreioneaAndrei Onea andreionea Data 8 februarie 2015 05:33:53
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>

#define MOD 9973

int powexp(int base, int expo)
{
	int rez = 1, p = base % MOD;
	while (expo) {
		if (expo & 1)
			rez = (rez * p) % MOD;
		p = (p * p) % MOD;
		expo >>= 1;
	}
	return rez;
}
int main()
{
	long long n, t;
	std::vector<bool> isprime(1 + 1000100, true);
	std::vector<int> primes;
	primes.reserve(328497);
	isprime[0] = isprime[1] = false;
	for (int i = 2; i <= 1000100; ++i) {
		if (isprime[i]) {
			primes.push_back(i);
			if (i < 2000)
			for (int j = i * i; j <= 1000100; j += i * 2)
				isprime[j] = false;
		}
	}
	std::ifstream f("ssnd.in");
	std::ofstream g("ssnd.out");
	f >> t;
	while (t--) 
	{
		f >> n;
		int rez1 = 1, rez2 = 1;
		auto i = primes.begin();
		auto end = primes.end();
		while (i != end) {
			auto p = (*i);
			if (p * p > n)
				break;
			i++;
			auto d = 1;
			while (n % p == 0) {
				d++;
				n /= p;
			}
			rez1 = (rez1 * d) % MOD;
			rez2 = (rez2 * (powexp(p, d) - 1)) % MOD;
			rez2 = (rez2 * powexp(p - 1, MOD - 2)) % MOD;
		}
		if (n > 1) {
			rez1 = (rez1 << 1) % MOD;
			rez2 = (rez2 * (n + 1)) % MOD;
		}
		g << rez1 << " " << rez2 << "\n";
	}
	f.close();
	g.close();
}