Cod sursa(job #827351)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 1 decembrie 2012 23:20:41
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>

using namespace std;

const int MaxN = 5000005;

int M, FPow2[MaxN], FPow3[MaxN], FPow5[MaxN], D, Solution;
int Pow2, Pow3, Pow5;

void Preprocess() {
    for (int k = 1; k <= M; ++k) {
        if (k % 2 == 0)
            FPow2[k] = FPow2[k / 2] + 1;
        if (k % 3 == 0)
            FPow3[k] = FPow3[k / 3] + 1;
        if (k % 5 == 0)
            FPow5[k] = FPow5[k / 5] + 1;
    }
}

inline int IsDivisible() {
    if (D == 2)
        return Pow2 > 0;
    if (D == 3)
        return Pow3 > 0;
    if (D == 4)
        return Pow2 > 1;
    if (D == 5)
        return Pow5 > 0;
    if (D == 6)
        return Pow2 > 0 && Pow3 > 0;
}

void Solve() {
    Preprocess();
    for (int k = 1, n = M; k <= M / 2; ++k, --n) {
        Pow2 += FPow2[n] - FPow2[k];
        Pow3 += FPow3[n] - FPow3[k];
        Pow5 += FPow5[n] - FPow5[k];
        Solution += 2*IsDivisible();
    }
    Solution -= (M % 2 == 0 && IsDivisible());
}

void Read() {
    freopen("pascal.in", "r", stdin);
    scanf("%d %d", &M, &D);
}

void Print() {
    freopen("pascal.out", "w", stdout);
    printf("%d\n", Solution);
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}