Cod sursa(job #3144426)

Utilizator SSKMFSS KMF SSKMF Data 8 august 2023 10:31:42
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
using namespace std;

ifstream cin ("pascal.in");
ofstream cout ("pascal.out");

int aparitii[2][5000001];

int main ()
{
    int linie , divizor;
    cin >> linie >> divizor;

    int factori[3] = {0} , exponent[3] = {0 , 0 , 0};
    if (divizor % 2 == 0) { factori[++factori[0]] = 2; while (!(divizor & 1)) divizor >>= 1 , exponent[factori[0]]++; }
    if (divizor > 1) factori[++factori[0]] = divizor , exponent[factori[0]]++;

    for (int valoare = 2; valoare <= linie ; valoare++)
        for (int indice = 0 , copie = valoare ; indice < factori[0] ; indice++)
        {
            aparitii[indice][valoare] = aparitii[indice][valoare - 1];
            while (copie % factori[indice + 1] == 0) {
                copie /= factori[indice + 1];
                aparitii[indice][valoare]++;
            }
        }

    auto Divizibil = [&] (const int valoare) -> bool {
        for (int indice = 0 ; indice < factori[0] ; indice++)
            if (aparitii[indice][linie] - aparitii[indice][linie - valoare] - aparitii[indice][valoare] < exponent[indice + 1])
                return false;

        return true;
    };

    int divizibile = 0;
    for (int coloana = 0 ; coloana <= ((linie - 1) >> 1) ; coloana++)
        if (Divizibil(coloana)) divizibile += 2;

    if (linie % 2 == 0 && Divizibil(linie >> 1))
        divizibile++;

    cout << divizibile;
    cout.close(); cin.close();
    return 0;
}