Cod sursa(job #2102387)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 8 ianuarie 2018 19:00:39
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream in("divizori.in");
ofstream out("divizori.out");

char c;

int nrdiv(int a)
{
    int d = 2, f, nr = 1;
    while (a != 1)
    {
        if (a % d == 0)
        {
            f = 0;
            while (a % d == 0)
            {
                ++f;
                a /= d;
            }
            nr *= f + 1;
        }
        if (d <= (int) sqrt(a))
        {
            if (d == 2)
                ++d;
            else
                d += 2;
        }
        else
            d = a;
    }
    return nr;
}

int nrc(int a)
{
    int nr = 0;
    while (a > 0)
    {
        ++nr;
        a /= 10;
    }
    return nr;
}

int main()
{
    long long numar = 0;
    int i, j = 0, n, k, x, nr, a = 0, MAX = 0, nrmax;
    bool ok = 1;
    in >> n >> k;
    for (i = 1; i <= n; ++i)
    {
        in >> c;
        if (j == 0)
        {
            numar = numar * 10 + (c - '0');
            ++j;
        }
        else
        {
            if (j != k - 1)
            {
                numar = numar * 10 + (c - '0');
                ++j;
            }
            else
            {
                numar = numar * 10 + (c - '0');
                x = nrdiv(numar);
                nr = nrc(x);
                if (x > MAX)
                {
                    MAX = x;
                    nrmax = numar;
                }
                else if (x == MAX)
                {
                    if (numar < nrmax)
                        nrmax = numar;
                }
                numar = x;
                j = nr;
                ++a;
            }
        }
    }
    if (nrc(numar) < k)
    {
        while (numar != nrdiv(numar))
        {
            ++a;
            numar = nrdiv(numar);
            if (nrdiv(numar) > MAX)
            {
                nrmax = numar;
                MAX = nrdiv(numar);
            }
            else if (nrdiv(numar) == MAX)
            {
                if (numar < nrmax)
                    nrmax = numar;
            }
        }
        ++a;
    }
    out << a << '\n' << MAX << '\n' << nrmax;
    return 0;
}