Cod sursa(job #2195983)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 17 aprilie 2018 22:41:08
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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, int m) {
    for(int d = 2; d <= r; d++) {
        int k = d, c = 0;
        if(m == 2 || m == 4 || m == 6) {
            while(k%2 == 0) {
                k /= 2;
                c++;
            }
            f[0][d] = f[0][d-1]+c;
            k = d, c = 0;
        }

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

            k = d, c = 0;
        }

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

int main()
{
    int r, d, s = 0, dif[3];
    in >> r >> d;
    computeF(r, d);
    for(int j = 1, n = r/2; j <= n; j++) {
        dif[0] = f[0][r] - f[0][j] - f[0][r-j];
        dif[1] = f[1][r] - f[1][j] - f[1][r-j];
        dif[2] = f[2][r] - f[2][j] - f[2][r-j];

        switch(d) {
            case 2:
                s += (dif[0] > 0);
                break;
            case 3:
                s += (dif[1] > 0);
                break;
            case 4:
                s += (dif[0] > 1);
                break;
            case 5:
                s += (dif[2] > 0);
                break;
            case 6:
                s += (dif[0] > 0 && dif[1] > 0);
                break;
        }
    }
    s *= 2;
    if(r%2 == 0) s--;
    out << s;
    return 0;
}