Cod sursa(job #893594)

Utilizator darrenRares Buhai darren Data 26 februarie 2013 16:39:35
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>

using namespace std;

int R, D;
int times[3], total; // 2, 3 sau 5 (ca divizori primi)
int p0[5000002], p1[5000002], p2[5000002];
bool done[5000002];

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

    done[1] = true;
    for (int i = 1; i < 100; ++i)
        if (!done[i * 2] || !done[i * 3] || !done[i * 5])
        {
            for (int j = i * 2, steps = 1; j < 5000000 && !done[j]; j *= 2, ++steps)
            {
                p0[j] = p0[i] + steps;
                p1[j] = p1[i];
                p2[j] = p2[i];
                done[j] = true;
            }
            for (int j = i * 3, steps = 1; j < 5000000 && !done[j]; j *= 3, ++steps)
            {
                p0[j] = p0[i];
                p1[j] = p1[i] + steps;
                p2[j] = p2[i];
                done[j] = true;
            }
            for (int j = i * 5, steps = 1; j < 5000000 && !done[j]; j *= 5, ++steps)
            {
                p0[j] = p0[i];
                p1[j] = p1[i];
                p2[j] = p2[i] + steps;
                done[j] = true;
            }
        }

    fin >> R >> D;
    for (int i = 1; i < R; ++i)
    {
        int now1 = R - i + 1, now2 = i;

        times[0] += p0[now1];
        times[1] += p1[now1];
        times[2] += p2[now1];
        times[0] -= p0[now2];
        times[1] -= p1[now2];
        times[2] -= p2[now2];

        if (D == 2 && times[0]) ++total;
        if (D == 3 && times[1]) ++total;
        if (D == 4 && times[0] >= 2) ++total;
        if (D == 5 && times[2]) ++total;
        if (D == 6 && times[0] && times[1]) ++total;
    }

    fout << total;

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