Cod sursa(job #2484102)

Utilizator Antonio020712Potra Antonio Antonio020712 Data 30 octombrie 2019 17:59:12
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
// Divizorii unui număr natural n reprezintă mulţimea de numere naturale, 
// mai mici sau egale cu n, cu proprietatea că divid pe n. Să se determine 
// pentru t numere naturale cardinalul acestei mulţimi şi restul împărţirii 
// sumei elementelor mulţimii la 9973.

#include <fstream>

using namespace std;

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

const int MAX = 1000000;
int t, nrPrime;
bool ciur[MAX];
int prime[MAX];

void eratostene() {
    int i, j;

    ciur[0] = ciur[1] = true;

    for (i = 2; i * i <= MAX; i++)
        if (ciur[i] == false)
            for (j = 2; j <= MAX / i; j++)
                ciur[i * j] = true;
    
    for (i = 2; i <= MAX; i++)
        if (ciur[i] == false)
            prime[++nrPrime] = i;
}

void rezolva(int n) {
    int i = 1, d = prime[i], p;
    unsigned long long nrDiv = 1, sumDiv = 1, dLaPutereaP = 1;

    while ((d * d <= n) && (i <= nrPrime)) {
        p = 0;
        dLaPutereaP = 1;
        while (n % d == 0) {
            p++;
            n /= d;
            dLaPutereaP *= d;
        }
        nrDiv *= (p + 1);
        sumDiv *= (dLaPutereaP * d - 1)/(d - 1);
        d = prime[++i];
    }
    if (n != 1) {
        nrDiv *= 2;
        sumDiv *= (1 + n);
    }

    fout << nrDiv << ' ' << sumDiv << '\n';
}

int main() {
    int i, a;

    eratostene();

    fin >> t;
    for (i = 1; i <= t; i++) {
        fin >> a;
        rezolva(a);
    }

    fin.close();
    fout.close();
    
    return 0;
}