Cod sursa(job #1336747)

Utilizator andreioneaAndrei Onea andreionea Data 8 februarie 2015 04:15:14
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <cmath>
#include <vector>
#define MOD 9973
long long powexp(long long base, long long expo)
{
	if (!expo)
		return 1;
	long long rez = 1, p = base;
	while (expo) {
		if (expo & 1)
			rez =  (rez * p) % MOD;
		p = (p * p) % MOD;
		expo /= 2;
	}
	return rez;
}
int main()
{
	long long n, t;
	std::vector<bool> isprime(1 + 1e6, true);
	std::vector<long long> primes;
	primes.reserve(78498);
	isprime[0] = isprime[1] = false;
	for (long long i = 2; i <= 1e6; ++i) {
		if (isprime[i]) {
			primes.push_back(i);
			if (i < 1e3)
			for (long long j = i * i; j <= 1e6; j += i * 2)
				isprime[j] = false;
		}
	}
	std::ifstream f("ssnd.in");
	std::ofstream g("ssnd.out");
	f >> t;
	while (t--) 
	{
		f >> n;
		long long rez1 = 1, rez2 = 1;
		auto i = primes.begin();
		auto ll = sqrtl(n);
		while (n > 1 && (*i) <= ll && i != primes.end()) {
			auto p = (*i);
			i++;
			auto d = 0;
			while (n % p == 0) {
				d++;
				n /= p;
			}
			rez1 = (rez1 * (d + 1)) % MOD;
			rez2 = (rez2 * (powexp(p, d + 1) - 1)) % MOD;
			rez2 = (rez2 * powexp(p - 1, MOD - 2)) % MOD;
		}
		if (n > 1) {
			rez1 = (2 * rez1) % MOD;
			rez2 = (rez2 * (n + 1)) % MOD;
		}
		g << rez1 << " " << rez2 << "\n";
	}
	f.close();
	g.close();
}