Cod sursa(job #1336739)

Utilizator andreioneaAndrei Onea andreionea Data 8 februarie 2015 03:48:25
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#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);
		p = (p * p);
		expo /= 2;
	}
	return rez;
}
int main()
{
	long long n, t;
	std::vector<bool> isprime(1 + 1e6, true);
	std::vector<long long> primes;
	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 * 2; j <= 1e6; j += i)
				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();
		while (n > 1 && 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) / (p - 1)) ) % MOD;
		}
		if (n > 1) {
			rez1 = (2 * rez1) % MOD;
			rez2 = (rez2 * ((powexp(n, 2) - 1) / (n- 1)) ) % MOD;
		}
		g << rez1 << " " << rez2 << "\n";
	}
	f.close();
	g.close();
}