Cod sursa(job #2610487)

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

using namespace std;

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

const int NMAX = 1000005;
const int MOD = 9973;
vector <int> primes;
bool ciur[NMAX / 2] = {0};
long long sum_div, nr_div, power, val, pr;

void init()
{
    primes.resize(NMAX / 2);
	for (int i = 2; i * i < NMAX; i++)
		if (!ciur[i])
		{
			primes.push_back(i);
			for (int j = i * i; j < NMAX; j += i)
				ciur[j] = 1;
		}
}

void divizori(long long numar)
{
    nr_div = sum_div = 1;
    for(unsigned int i = 1; i < primes.size() && primes[i] * primes[i] * 1LL <= numar; i++)
    {
        power = 0; pr = 1;
        while(!(numar % primes[i]))
        {
            numar /= primes[i];
			power++;
			pr *= primes[i];
        }
        if (power)
		{
			nr_div *= (power + 1);
			sum_div = ((sum_div * (pr * primes[i] - 1)) / (primes[i] - 1)) % MOD;
		}
    }

    if(numar > 1)
    {
        nr_div *= 2;
        sum_div = (sum_div * (numar + 1)) % MOD;
    }
	fout << nr_div << ' ' << sum_div << '\n';
}

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