Cod sursa(job #3357381)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 9 iunie 2026 10:12:23
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 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 f2 = 0, f3 = 0, f5 = 0;
};
int n, k, i, rasp;

static inline void Desc(int n, Fact& f) {
    f.f2 = f.f3 = f.f5 = 0;
    while(0 == n % 2) {
        f.f2++;
        n /= 2;
    }
    while(0 == n % 3) {
        f.f3++;
        n /= 3;
    }
    while(0 == n % 5) {
        f.f5++;
        n /= 5;
    }
}

static inline bool Divi(const Fact& a, const Fact& d) {
    return (a.f2 >= d.f2 && a.f3 >= d.f3 && a.f5 >= d.f5);
}

static inline void Add(Fact& f, const Fact& a) {
    f.f2 += a.f2;
    f.f3 += a.f3;
    f.f5 += a.f5;
}

static inline void Del(Fact& f, const Fact& a) {
    f.f2 -= a.f2;
    f.f3 -= a.f3;
    f.f5 -= a.f5;
}

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;

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

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

        Desc(i, factDesc);
        Del(factCur, factDesc);

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

    return 0;
}