Cod sursa(job #941595)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 aprilie 2013 09:26:34
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 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; i++)
    {
        if (r > left + right)
            sol++;
        left = left + nnum(i + 1);
        right = right - nnum(R - i);
    }

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