Cod sursa(job #1459613)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 10 iulie 2015 13:16:27
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>

#define NMAX 5000001

using namespace std;

int fact2[NMAX], fact3[NMAX], fact5[NMAX];

int powInN(int n, int d)
{
    int sol = 0;
    while(n % d == 0)
    {
        n /= d;
        sol++;
    }
    return sol;
}

void calcFact(int r)
{
    for (int i = 1; i <= r; i++)
    {
        fact2[i] = fact2[i - 1] + powInN(i, 2);
        fact3[i] = fact3[i - 1] + powInN(i, 3);
        fact5[i] = fact5[i - 1] + powInN(i, 5);
    }
}

int divFact(int n, int d)
{
    if(d == 2) return fact2[n];
    if(d == 3) return fact3[n];
    return fact5[n];
}

int power(int line, int col, int d)
{
    if(d == 4)
    {
        return ((divFact(line, 2) - divFact(line - col, 2) - divFact(col, 2)) / 2);
    }
    else if(d == 6)
    {
        return min((divFact(line, 2) - divFact(line - col, 2) - divFact(col, 2)), (divFact(line, 3) - divFact(line - col, 3) - divFact(col, 3)));
    }
    else
    {
        return (divFact(line, d) - divFact(line - col, d) - divFact(col, d));
    }
    return 0;
}

int check(int line, int col, int d)
{
    if(power(line, col, d))
        return 1;
    return 0;
}

int main()
{
    int r, d;
    int sol = 0;
    ifstream f("pascal.in");
    f >> r >> d;
    f.close();
    calcFact(r);
    int lim = (r - 1) / 2;
    for(int j = 0; j <= lim; j++)
        sol += check(r, j, d);
    sol *= 2;
    if(r % 2 == 0)
        sol += check(r, r / 2, d);
    ofstream g("pascal.out");
    g << sol << "\n";
    g.close();
    return 0;
}