Cod sursa(job #2195978)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 17 aprilie 2018 22:28:41
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int maxR = 50000000;
int f[3][maxR+1];

void computeF(int r) {
    for(int d = 2; d <= r; d++) {
        int k = d, c = 0;
        while(k%2 == 0) {
            k /= 2;
            c++;
        }
        f[0][d] = f[0][d-1]+c;

        k = d, c = 0;

        while(k%3 == 0) {
            k /= 3;
            c++;
        }
        f[1][d] = f[1][d-1]+c;

        k = d, c = 0;
        while(k%5 == 0) {
            k /= 5;
            c++;
        }
        f[2][d] = f[2][d-1]+c;
    }
}

int main()
{
    int r, d, s = 0;
    in >> r >> d;
    computeF(r);
    if(d == 6) {
        for(int j = 1, n = r/2; j <= n; j++) {
            if(f[0][r] - f[0][j] - f[0][r-j] > 0 && f[1][r] - f[1][j] - f[1][r-j] > 0)
                s++;
        }
        s *= 2;
        if(r%2 == 0) s--;
    } else if (d == 4) {
        for(int j = 1, n = r/2; j <= n; j++) {
            if(f[0][r] - f[0][j] - f[0][r-j] > 1)
                s++;
        }
        s *= 2;
        if(r%2 == 0) s--;
    } else {
        int k;
        if(d == 2) k = 0;
        else if(d == 3) k = 1;
        else if(d == 5) k = 2;

        for(int j = 1, n = r/2; j <= n; j++) {
            if(f[k][r] - f[k][j] - f[k][r-j] > 0)
                s++;
        }
        s *= 2;
        if(r%2 == 0) s--;
    }

    out << s;
    return 0;
}