Cod sursa(job #1832893)

Utilizator SburlyAndrei Florin Sburly Data 21 decembrie 2016 09:50:00
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
/********************
    Created by Sburly
********************/
#include <fstream>

using namespace std;

unsigned long int r;
int d;

unsigned int nr2[2500000], nr3[2500000], nr5[2500000];
unsigned int cd[2500000][3];

int calcdiv(int nr, int d)
{
    int temp = nr;
    int p = d;
    int val = temp/p;
    int sol = 0;
    while(val)
    {
        sol += val;
        p*=d;
        val = temp/p;
    }
    return sol;
}

bool b = false;
bool b2 = false;

int main()
{
    ifstream f("pascal.in");
    ofstream g("pascal.out");

    f >> r >> d;

    unsigned int r2 = r/2+1;

    if(r%2 == 0)
    {
        b = true;
    }

    unsigned int lv2 = calcdiv(r,2);
    unsigned int lv3 = calcdiv(r,3);
    unsigned int lv5 = calcdiv(r,5);

    for(unsigned int i = 0; i < r+1; i++)
    {
        cd[i][0] = calcdiv(i,2);
        cd[i][1] = calcdiv(i,3);
        cd[i][2] = calcdiv(i,5);
    }

    for(unsigned int i = 0; i < r2; i++)
    {
        nr2[i] = lv2 - cd[r-i][0] - cd[i][0];
    }
    for(unsigned int i = 0; i < r2; i++)
    {
        nr3[i] = lv3 - cd[r-i][1] - cd[i][1];
    }
    for(unsigned int i = 0; i < r2; i++)
    {
        nr5[i] = lv5 - cd[r-i][2] - cd[i][2];
    }

    if(b) r2--;

    int k = 0;
    if(d == 2)
    {
        for(unsigned int i = 0; i < r2; i++)
        {
            if(nr2[i] != 0) k++;
        }
        if(b) if(nr2[r2] != 0) b2 = true;
    }
    else
    if(d == 3)
    {
        for(unsigned int i = 0; i < r2; i++)
        {
            if(nr3[i] != 0) k++;
        }

        if(b) if(nr3[r2] != 0) b2 = true;
    }
    else
    if(d == 4)
    {
        for(unsigned int i = 0; i < r2; i++)
        {
            if(nr2[i] >= 2) k++;
        }
        if(b) if(nr2[r2] >= 2) b2 = true;
    }
    else
    if(d == 5)
    {
        for(unsigned int i = 0; i < r2; i++)
        {
            if(nr5[i] != 0) k++;
        }
        if(b) if(nr5[r2] != 0) b2 = true;
    }
    else
    if(d == 6)
    {
        for(unsigned int i = 0; i < r2; i++)
        {
            if(nr2[i] != 0 && nr3[i] != 0) k++;
        }
        if(b) if(nr2[r2] != 0 && nr3[r2] != 0) b2 = true;
    }

    if(r == 2 && d == 2)
        g << 1;
    else
    if(b2)
        g << k*2+1;
    else
        g << k*2;


    return 0;
}