Cod sursa(job #713554)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 14 martie 2012 19:16:58
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb

#include <fstream>
#include <cmath>
#include <vector>

std::vector<unsigned int> v(1,2);
bool c [1000000];

int main (void)
{
    std::vector<unsigned int>::iterator ptrv(v.begin());
    bool *ptrc(c + 3);
    long long i;
    bool *ptr3;
    const bool *const LIMIT(c + 1000001);
    do
    {
        if (!*ptrc)
        {
            i = ptrc - c;
            v.push_back(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;
    unsigned int e;
    long long power;
    input >> t;
    std::ofstream output("ssnd.out");
    do
    {
        input >> i;
        ptrv = v.begin();
        e = std::sqrt(i);
        s = 1;
        card = 1;
        p = 0;
        power = 1;
        do
        {
            while (!(i % *ptrv))
            {
                i /= *ptrv;
                ++p;
                power *= *ptrv;
                if (i == 1)
                    break;
            }
            if (p)
            {
                power *= *ptrv;;
                d = *ptrv;
                card *= p + 1;
                s *= (power - 1) / (d - 1);
                p = 0;
                power = 1;
            }
            ++ptrv;
            if (*ptrv > e && i != 1)
            {
                card <<= 1;
                s *= (i * i - 1) / (i - 1);
                break;
            }
        }
        while (i != 1);
        output << card << ' ' << s % 9973 << '\n';
        --t;
    }
    while (t);
    input.close();
    output.close();
    return 0;
}