Cod sursa(job #941607)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 aprilie 2013 10:08:09
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("pascal.in");
ofstream fout("pascal.out");
int R, D, lg, fact[30];

int nfact(int N)
{
    int sol = 0;
    while (N)
        sol = sol + (N /= D);
    return sol;
}
int nnum(int N)
{
    int i = 0, cnt = 1 << 5;
    for (; cnt > 0; cnt >>= 1)
        if (i + cnt < lg and N % fact[i + cnt] == 0)
            i += cnt;
    return i;
}

int main()
{
    fin >> R >> D;
    fact[0] = 1;
    for (lg = 1; fact[lg - 1] <= R; lg++)
        fact[lg] = fact[lg - 1] * D;

    // R! / K! * (R-K)!
    int r = nfact(R), left = 0, right = r, sol = 0;
    for (int i = 0; i <= (R >> 1); i++)
    {
        if (r > left + right)
            sol++;
        left = left + nnum(i + 1);
        right = right - nnum(R - i);
    }
    sol = sol << 1;
    if (!(R & 1))
        if (nfact(R) > 2 * nfact(R >> 1))
            sol--;

    fout << sol << '\n';
    fin.close();
    fout.close();
    return 0;
}