Cod sursa(job #2610390)

Utilizator dancu_mihai13Dancu Mihai dancu_mihai13 Data 4 mai 2020 20:18:45
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100005;
const int MOD = 9973;
int primes[NMAX], c;
bool ciur[NMAX / 2];
long long sum_div, nr_div, d, power;

void init()
{
	primes[0] = 2;
	for (int i = 1; i * i < NMAX; i++)
		if (!ciur[i])
		{
			primes[++c] = 2 * i + 1;
			for (int j = 3 * i + 1; j < NMAX; j += (2 * i + 1))
				ciur[j] = 1;
		}
	for (int i = sqrt(NMAX); i < NMAX; i++)
		if (!ciur[(i - 1) / 2] && i % 2 == 1)
			primes[++c] = i;
}

long long exp_log(int n, int k)
{
	long long r = 1;
	while (k)
	{
		if (k % 2)
			r = r * n;
		n = n * n;
		k /= 2;
	}
	return r;
}

void divizori(long long numar)
{
	nr_div = sum_div = 1;
	int j = 0;
	d = primes[j];
	while (numar > 1)
	{
		power = 0;
		while (!(numar % d))
		{
			numar /= d;
			power++;
		}
		if (power)
		{
			nr_div *= (power + 1);
			sum_div = ((sum_div * (exp_log(d, power + 1) - 1)) / (d - 1)) % MOD;
		}
		j++;
		d = primes[j];
		if(d * d > numar && numar > 1)
            d = numar;
	}
	fout << nr_div << ' ' << sum_div << '\n';
}

int main()
{
	int nr; fin >> nr; long long val;
	init();
	for (int i = 0; i < nr; i++)
	{
		fin >> val;
		divizori(val);
	}
	return 0;
}