Cod sursa(job #2689568)

Utilizator Turica_Andrei_CosminTurica Andrei Turica_Andrei_Cosmin Data 21 decembrie 2020 13:21:44
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 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;
    int minim = 1;

    in >> r >> d;

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

    if (d == 4)
    {
        initExp(exp[0], r, 2);
        minim = 2;
    }
    else if (d == 6)
    {
        initExp(exp[0], r, 2);
        initExp(exp[1], r, 3);
    }
    else
    {
        initExp(exp[0], r, d);
    }

    int i = 1;
    for (i = 1; i <= (r - 1) / 2; i++)
    {
        if (exp[0][r] - exp[0][i] - exp[0][r - i] >= minim)
        {
          if (d != 6)
          {
            sol += 2;
          }
          else
          {
            if (exp[1][r] - exp[1][i] - exp[1][r - i] >= minim)
              sol += 2;
          }
        }
    }

    if (r % 2 == 0)
    {
        if (exp[0][r] - exp[0][i] - exp[0][r - i] >= minim)
        {
          if (d != 6)
          {
            sol++;
          }
          else
          {
            if (exp[1][r] - exp[1][i] - exp[1][r - i] >= minim)
              sol++;
          }
        }
    }

    out << sol << '\n';

    return 0;
}