Cod sursa(job #1459615)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 10 iulie 2015 13:26:34
Problema Pascal Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 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;
    if(d == 2)
        while((n & 1) == 0)
        {
            n >>= 1;
            sol++;
        }
    else
        while(n % d == 0)
        {
            n /= d;
            sol++;
        }
    return sol;
}

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

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, d);
    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;
}