Cod sursa(job #2042554)

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

const int MOD = 9973;

typedef long long LL;

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

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

		primes.push_back(i);
	}
}

pair<LL, LL> euclid(LL x, LL y) {
	if(!y) return {1, 0};
	auto result = euclid(y, x % y);
	return {result.second, result.first - x / y * result.second};
}

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 = 1;

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

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

		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;
}