Cod sursa(job #3357380)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 9 iunie 2026 10:08:51
Problema Pascal Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

#define USE_STD_IO 0
#if USE_STD_IO
    #define fin cin
    #define fout cout
#else
    ifstream fin("pascal.in");
    ofstream fout("pascal.out");
#endif // USE_STD_IO

struct Fact {
    int a[3];
};
const int DESC[] = {2, 3, 5};
int n, k, i, rasp;

static inline void Desc(int n, Fact& f) {
    f.a[0] = f.a[1] = f.a[2] = 0;
    for(int i = 0; i < 3; i++) {
        while(0 == n % DESC[i]) {
            f.a[i]++;
            n /= DESC[i];
        }
    }
}

static inline bool Divi(const Fact& a, const Fact& d) {
    for(int i = 0; i < 3; i++) {
        if(a.a[i] < d.a[i]) return false;
    }
    return true;
}

static inline void Add(Fact& f, const Fact& a, int semn) {
    for(int i = 0; i < 3; i++) {
        f.a[i] += semn * a.a[i];
    }
}

int main() {
    #if USE_STD_IO
        ios_base::sync_with_stdio(false);
    #endif // USE_STD_IO
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> k;

    Fact factK;
    Desc(k, factK);

    Fact factCur;
    factCur.a[0] = 0;
    factCur.a[1] = 0;
    factCur.a[2] = 0;

    for(i = 1; i <= n; i++) {
        Fact factDesc;

        Desc(n - i + 1, factDesc);
        Add(factCur, factDesc, 1);

        Desc(i, factDesc);
        Add(factCur, factDesc, -1);

        if(Divi(factCur, factK)) {
            rasp++;
        }
    }
    fout << rasp;

    return 0;
}