Cod sursa(job #2042585)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 18 octombrie 2017 20:32:00
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 9973;

typedef long long LL;

int n;
bitset<1000005> not_prime;
vector<LL> primes;

void sieve() {
	primes.push_back(2);

	for(int i = 4; i <= 1000000; i += 2) {
		not_prime[i] = 1;
	}

	for(int i = 3; i <= 1000000; i += 2) {
		if(!not_prime[i]) {
			for(int j = i << 1; j <= 1000000; j += (i << 1))
				not_prime[j] = 1;
		}

		primes.push_back(i);
	}
}

LL logPower(LL number, LL power) {
	LL result = 1LL;
	while(power) {
		if(power & 1LL) {
			result *= number;
		}
		number *= number;
		power >>= 1LL;
	}
	return result;
}

void solve() {
	scanf("%d ", &n);
	while(n--) {
		LL number;
		scanf("%lld ", &number);

		int divCount = 1, divSum = 1;

		for(LL prime : primes) {
			if(prime * prime > number)
				break;

			int power = 0;

			while(number % prime == 0) {
				power++;
				number /= prime;
			}

			if(power != 0) {
				divSum *= (logPower(prime, power + 1) - 1) / (prime - 1);
				divSum %= MOD;
				divCount *= (power + 1);
			}
		}

		if(number != 1) {
			divSum *= (logPower(number, 2) - 1) / (number - 1);
			divSum %= MOD;
			divCount *= 2;
		}

		printf("%d %d\n", divCount, divSum);
	}
}

int main() {
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);

	sieve();
	solve();

	return 0;
}