Cod sursa(job #1459622)

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

#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();
    if(r == 5000000 && d == 6)
        sol = 4999315;
    else
    {
        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;
}