Cod sursa(job #713485)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 14 martie 2012 18:09:43
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb

#include <fstream>
#include <cmath>

unsigned int v [78499];
bool c [1000000];

int main (void)
{
    v[0] = 2;
    unsigned int *ptrv(v);
    bool *ptrc(c + 3);
    long long i;
    bool *ptr3;
    const bool *const LIMIT(c + 1000001);
    do
    {
        if (!*ptrc)
        {
            i = ptrc - c;
            ++ptrv;
            *ptrv = i;
            for (ptr3 = ptrc + i; ptr3 < LIMIT ; ptr3 += i)
                *ptr3 = true;
        }
        ptrc += 2;
    }
    while (ptrc < LIMIT);
    std::ifstream input("ssnd.in");
    unsigned short t;
    unsigned short p;
    unsigned int d;
    long long s;
    unsigned int card;
    input >> t;
    std::ofstream output("ssnd.out");
    do
    {
        input >> i;
        ptrv = v;
        s = 1;
        card = 1;
        do
        {
            p = 0;
            while (!(i % *ptrv))
            {
                i /= *ptrv;
                ++p;
                if (i == 1)
                    break;
            }
            if (p)
            {
                d = *ptrv;
                card *= p + 1;
                s *= (pow(d,p + 1) - 1) / (d - 1);
            }
            ++ptrv;
        }
        while (i != 1);
        output << card << ' ' << s % 9973 << '\n';
        --t;
    }
    while (t);
    input.close();
    output.close();
    return 0;
}