Cod sursa(job #2673695)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 17 noiembrie 2020 16:01:33
Problema Pascal Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

using namespace std;

const int NMAX = 5000000;
int exp[2][1 + NMAX];

void initExp(int* exp, int lim, int d)
{
    for (int base = d; base <= lim; base = base * d)
    {
        for (int j = base; j <= lim; j = j + base)
        {
            exp[j]++;
        }
    }

    for (int i = 1; i <= lim; i++)
    {
        exp[i] += exp[i - 1];
    }
}

int main()
{
    ifstream in("pascal.in");
    ofstream out("pascal.out");
    int r;
    int d;
    int sol = 0;

    in >> r >> d;

    if (r < 2)
    {
        out << 0;
        return 0;
    }

    if (d == 4)
    {
        initExp(exp[0], r / 2, 2);

        for (int i = 1; i <= r / 2; i++)
        {
          exp[0][i] /= 2;
        }
    }
    else if (d == 6)
    {
        initExp(exp[0], r, 2);
        initExp(exp[1], r, 3);

        for (int i = 1; i <= r / 2; i++)
        {
          exp[0][i] = min(exp[0][i], exp[1][i]);
        }
    }
    else
    {
        initExp(exp[0], r, d);
    }

    int i = 1;
    for (i = 1; i <= (r - 1) / 2; i++)
    {
        // out << r << ' ' << i << ": " << exp[0][r] << ' ' << exp[0][i] << ' ' << exp[0][r - i] << endl;
        if (exp[0][r] - exp[0][i] - exp[0][r - i] > 0)
        {
          sol += 2;
        }
    }

    if (r % 2 == 0)
    {
         // out << r << ' ' << i << ": " << exp[0][r] << ' ' << exp[0][i] << ' ' << exp[0][r - i] << endl;
        if (exp[0][r] - exp[0][i] - exp[0][r - i] > 0)
        {
          sol++;
        }
    }

    out << sol << '\n';

    return 0;
}