Cod sursa(job #2195771)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 17 aprilie 2018 12:59:08
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <iostream>

using namespace std;

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

short leg[3][50000000];
/*
void computeFact(int n) {
    for(int i = 2; i <= n; i++) {
        int k = i, c = 0;
        while(k%2 == 0) {
            k /= 2;
            c++;
        }
        ap[0][i] = ap[0][i-1]+c;

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

        k = i;
        while(k%5 == 0) {
            k /= 5;
            c++;
        }
        ap[2][i] = ap[2][i-1]+c;
    }
}*/

int legendre(int n, int k) {
    int r = n/k, s = 0, exp = k;
    while(r != 0) {
        s += r;
        exp *= k;
        r = n/exp;
    }
    return s;
}

void computeLeg(int n) {
    for(int i = 2; i <= n; i++) {
        leg[0][i] = legendre(i, 2);
        leg[1][i] = legendre(i, 3);
        leg[2][i] = legendre(i, 5);
    }
}

int main()
{
    int r, d, s = 0, ap[0];
    in >> r >> d;
    if(d == 6) {
        ap[0] = legendre(r, 2);
        ap[1] = legendre(r, 3);
        for(int j = 1; j < r; j++) {
            if(ap[0] - leg[0][j] - leg[0][r-j] > 0 && ap[1] - leg[1][j] - leg[1][r-j] > 0)
                s++;
        }
    } else if (d== 4) {
        ap[0] = legendre(r, 2);
        for(int j = 1; j < r; j++) {
            if(ap[0] - leg[0][j] - leg[0][r-j] > 1)
                s++;
        }
    } else {
        ap[0] = legendre(r, d);
        int sl;
        if(d == 2) sl = 0;
        else if(d == 3) sl = 1;
        else if(d == 5) sl = 2;
        for(int j = 1; j < r; j++) {
            if(ap[0] - leg[sl][j] - leg[sl][r-j] > 0)
                s++;
        }
    }

    out << s;
    return 0;
}