Cod sursa(job #2918051)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 9 august 2022 16:02:38
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

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

const int VMAX = 1e6;
const int MOD = 9973;

int t;
vector<int> primes;

void buildPrimes(int n = VMAX) {
	vector<bool> seive(n + 1);

	seive[0] = seive[1] = 1;

	primes.push_back(2);
	for(int i = 4; i <= n; i += 2) {
		seive[i] = 1;
	}

	for(int i = 3; i <= n; i += 2) {
		if(seive[i] == 0) {
			primes.push_back(i);

			if((long long) i * i <= (long long) n) {
				for(int j = i * i; j <= n; j += i) {
					seive[j] = 1;
				}
			}
		}
	}
}

int main() {
	fin >> t;

	buildPrimes();

	for(int i = 1; i <= t; i++) {
		long long n;
		fin >> n;

		int sum = 1, prod = 1;

		for(int i = 0; i < (int) primes.size() && (long long) primes[i] * primes[i] <= n; i++) {
			int p = primes[i], q = 0;

			int grrPow = 1, sumPow = 1; // muienanefreemgk

			while(n % p == 0) {
				q++;
				n /= p;

				grrPow = (long long) grrPow * p % MOD;
				sumPow += grrPow;

				if(sumPow >= MOD) {
					sumPow -= MOD;
				}
			}

			sum = (long long) sum * (q + 1) % MOD;
			prod = (long long) prod * sumPow % MOD;
		}

		if(n > 1) {
			sum = (long long) sum * 2 % MOD;
			prod = (long long) prod * (n + 1) % MOD;
		}

		fout << sum << " " << prod << '\n';
	}
	return 0;
}