Cod sursa(job #1336763)

Utilizator andreioneaAndrei Onea andreionea Data 8 februarie 2015 06:02:34
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>

#define MOD 9973
#define MOD_2 9971

int powexp(int base, int expo)
{
	int rez = 1;
	base %= MOD;
	while (expo) {
		if (expo & 1)
			rez = (rez * base) % MOD;
		base = (base * base) % MOD;
		expo /= 2;
	}
	return rez;
}
int main()
{
	long long n, t;
	std::vector<bool> isprime(1 + 1000000, true);
	std::vector<int> primes;
	primes.reserve(328497);
	isprime[0] = isprime[1] = false;
	primes.push_back(2);
	for (int i = 3; i <= 1000000; i += 2) {
		if (isprime[i]) {
			primes.push_back(i);
			if (i < 1000)
			for (int j = i * i; j <= 1000000; j += i << 1)
				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;
			if (n % p)
				continue;
			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();
}