Cod sursa(job #2935958)

Utilizator matthriscuMatt . matthriscu Data 7 noiembrie 2022 18:58:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;

#define DIVMAX 1'000'010
#define MOD 9973LL

typedef long long ll;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

vector<ll> primes;

ll mod(ll x) {
	return (x + MOD) % MOD;
}

void sieve(ll n) {
	vector<bool> is_prime(n + 1, true);

	for (ll i = 2; i <= n; ++i)
		if (is_prime[i]) {
			primes.push_back(i);
			for (ll j = 2 * i; j <= n; j += i)
				is_prime[j] = false;
		}
}

ll pw(ll b, ll e) {
	ll ans = 1LL;
	while (e) {
		if (e & 1LL)
			ans = mod(ans * b);
		b = mod(b * b);
		e >>= 1;
	}
	return ans;
}

ll inv(ll x) {
	return pw(x, MOD - 2);
}

void solve() {
	ll n;
	fin >> n;

	ll nd = 1LL, sum = 1LL;
	for (ll p : primes) {
		if (p * p > n)
			break;

		if (n % p == 0) {
			ll d = 1;
			while (n % p == 0) {
				++d;
				n /= p;
			}
			nd = mod(nd * d);
			sum = mod(sum * (pw(p, d) - 1));
			sum = mod(sum * inv(p - 1));
		}
	}

	if (n != 1LL) {
		nd = (nd * 2) % MOD;
		sum = mod(sum * (pw(n, 2) - 1));
		sum = mod(sum * inv(n - 1));
	}

	fout << nd << ' ' << sum << '\n';
}

int main() {
	ll t;
	fin >> t;

	sieve(DIVMAX);

	while (t--)
		solve();
}