Cod sursa(job #1741079)

Utilizator mariusn01Marius Nicoli mariusn01 Data 12 august 2016 22:47:23
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
// c[n][k] = c[n][k-1] * k! / (n-k+1)!
// precalculez la fiecare numar puterea lui d care apare in el
// si cand trec de la o combinare la urmatoarea doar adun o putere si scad alta

#include <fstream>
#define DIM 5000010

using namespace std;

ifstream fin ("pascal.in");
ofstream fout("pascal.out");

int n, d, sol, c2, c3, c5;
int D[DIM], T[DIM], C[DIM];
int main () {
    fin>>n>>d;


    if (d == 2 || d == 4 || d == 6) {
        for (int i=2;i<=n;i+=2) {
            D[i] = 1 + D[i/2];
        }
    }
    if (d == 3 || d == 6) {
        for (int i=3;i<=n;i+=3) {
            T[i] = 1 + T[i/3];
        }
    }
    if (d == 5) {
        for (int i=5;i<=n;i+=5) {
            C[i] = 1 + C[i/5];
        }
    }

    for (int i=1;i<=n;i++) {
        c2 += D[n-i+1] - D[i];
        c3 += T[n-i+1] - T[i];
        c5 += C[n-i+1] - C[i];

        if (d == 2&&c2)
            sol++;
        else
            if (d == 3 && c3)
                sol++;
            else
                if (d == 4 && c2 > 1)
                    sol++;
                else
                    if (d == 5 && c5)
                        sol++;
                    else
                        if (d == 6 && c2 && c3)
                            sol++;


    }

    fout<<sol;
    return 0;
}