Cod sursa(job #731560)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 8 aprilie 2012 14:04:43
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb

#include <fstream>
#include <cmath>

int main (void)
{
    unsigned int a,b;
    std::ifstream input("sumdiv.in");
    input >> a >> b;
    input.close();
    unsigned short primes [15],*prim_ptr(primes);
    unsigned int powers [15],*pow_ptr(powers),aux(a);
    if (!(a && b))
    {
        std::ofstream output("sumdiv.out");
        output << (a ? '1' : '0') << '\n';
        output.close();
        return 0;
    }
    if (!(a % 2))
    {
        *prim_ptr = 2;
        ++prim_ptr;
        *pow_ptr = 1;
        a >>= 1;
        while (!(a % 2))
        {
            a >>= 1;
            ++*pow_ptr;
        }
        *pow_ptr *= b;
        ++pow_ptr;
    }
    for (unsigned short i(3), limit(std::sqrt(aux)) ; i <= limit ; i += 2)
    {
        if (!(a % i))
        {
            *prim_ptr = i;
            ++prim_ptr;
            *pow_ptr = 1;
            a /= i;
            while (!(a % i))
            {
                a /= i;
                ++*pow_ptr;
            }
            *pow_ptr *= b;
            ++pow_ptr;
        }
    }
    if (a != 1)
    {
        *prim_ptr = a;
        *pow_ptr = 1;
    }
    else
    {
        --prim_ptr;
        --pow_ptr;
    }
    unsigned long long result(1),e;
    const unsigned short MOD(9901);
    unsigned int power,base;
    unsigned int bit;
    while (prim_ptr >= primes)
    {
        base = *prim_ptr;
        power = *pow_ptr + 1;
        e = 1;
        for (bit = 0x01 ; bit <= power ; bit <<= 1)
        {
            if (bit & power)
                e *= base;
            base *= base;
            if (e > MOD)
                e %= MOD;
            if (base > MOD)
                base %= MOD;
        }
        --e;
        if (e > MOD)
            e %= MOD;
        e /= *prim_ptr - 1;
        result *= e;
        --prim_ptr;
        --pow_ptr;
    }
    std::ofstream output("sumdiv.out");
    output << result % MOD << '\n';
    output.close();
    return 0;
}