Cod sursa(job #2673789)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 17 noiembrie 2020 19:00:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#define ll long long

const int N = 1e6;
const int mod = 9973;

std::vector<ll>p;
bool ciur[N+5];

int prod(int a, int b) { return (1LL * a * b) % mod; }
int sum(int a, int b) { return (a + b + mod) % mod; }
void sieve() {
	ciur[0] = ciur[1] = 1;
	for (int i = 4; i <= N; i += 2) ciur[i] = 1;
	for (int i = 3; i * i <= N; i+=2)
		if (!ciur[i])
			for (int j = i * i; j <= N; j += 2 * i) ciur[j] = 1;
	for (int i = 1; i <= N; i++)
		if (!ciur[i])
			p.push_back(i);
}

int putlog(int n, int k) {
	if (k == 0) return 1;
	int x = putlog(n, k / 2);
	if (k % 2 == 0) return prod(x, x);
	return prod(prod(x, x), n);
}

int inv(int n) {
	return putlog(n, mod - 2);
}

int main() {
	std::ifstream fin("ssnd.in");
	std::ofstream fout("ssnd.out");
	sieve();
	ll t, n;
	fin >> t;
	while (t--) {
		fin >> n;
		ll sdiv = 1, nr = 1, k = 0;
		for (int i = 0; i < p.size(), n != 1, p[i] * p[i] <= n; i++) {
			int x = p[i];
			if (n % x == 0) {
				k = 0;
				while (n % x == 0) n /= x, k++;
				sdiv = prod(sdiv, prod(sum(putlog(x, k + 1), -1), inv(x - 1)));
				nr *= k + 1;
			}
			if (n == 1) break;
		}
		if (n - 1) {
			sdiv = prod(sdiv, prod(sum(putlog(n, 2), -1), inv(n - 1)));
			nr *= 2;
		}
		fout << nr << " " << sdiv << "\n";
	}
}