Cod sursa(job #597109)

Utilizator darrenRares Buhai darren Data 21 iunie 2011 10:08:15
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>

using namespace std;

const int prim[] = {2, 3, 5};

int R, D;
int times[3], total; // 2, 3 sau 5 (ca divizori primi)

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

    fin >> R >> D;
    for (int i = 1; i <= R / 2; ++i)
    {
        // P[R][i] = R! / i! * (R - i)!, deci P[R][i] = P[R][i - 1] * (R - i + 1) / i

        int now1 = R - i + 1, now2 = i;
        for (int i = 0; i < 3; ++i)
        {
            while (now1 % prim[i] == 0)
                ++times[i], now1 /= prim[i];
            while (now2 % prim[i] == 0)
                --times[i], now2 /= prim[i];
        }

        int num = 1;
        for (int i = 0; i < 3; ++i)
            if (times[i] >= 2) num *= prim[i] * prim[i];
            else if (times[i]) num *= prim[i];

        if (num % D == 0) ++total;
        if (num % D == 0 && !(R % 2 == 0 && i == R / 2)) ++total;
    }

    fout << total;

    fin.close();
    fout.close();
}