Pagini recente » Cod sursa (job #512761) | Cod sursa (job #94882) | Cod sursa (job #3144426)
#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;
}