Cod sursa(job #1000519)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 23 septembrie 2013 01:05:38
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <iostream>
#include <fstream>

using namespace std;

int R, D;
int sol;
int nrdiv;
int Exp[6];
struct DIV
{
    int d, e;
};
DIV a[3];

inline void Read()
{
    ifstream f ("pascal.in");
    f>>R>>D;
    f.close();
}

inline void CreateDivsList()
{
    switch(D)
    {
        case 2:
            nrdiv = 1;
            a[1].d = 2;
            a[1].e = 1;
            break;
        case 3:
            nrdiv = 1;
            a[1].d = 3;
            a[1].e = 1;
            break;
        case 4:
            nrdiv = 1;
            a[1].d = 2;
            a[1].e = 2;
            break;
        case 5:
            nrdiv = 1;
            a[1].d = 5;
            a[1].e = 1;
            break;
        case 6:
            nrdiv = 2;
            a[1].d = 2;
            a[1].e = 1;
            a[2].d = 3;
            a[2].e = 1;
            break;
    }
}

inline void Solve()
{
    CreateDivsList();
    int i, lim = (R+1) / 2 - 1, j, x, nr;
    int ok;
    for (i = 1; i<=lim; ++i)
    {
        /// * (R-i) / (i+1)
        x = R-i+1;
        for (j=1; j<=nrdiv; ++j)
        {
            nr = a[j].d;
            while (x%nr == 0)
            {
                ++Exp[nr];
                x/=nr;
            }
        }

        x = i;
        for (j=1; j<=nrdiv; ++j)
        {
            nr = a[j].d;
            while (x%nr == 0)
            {
                --Exp[nr];
                x/=nr;
            }
        }
        ok = 1;
        for (j=1; j<=nrdiv; ++j)
        {
            if (Exp[a[j].d] < a[j].e)
                ok = 0;
        }
        sol += ok+ok;
    }
    if (R % 2 == 0)
    {
        x = R-i+1;
        for (j=1; j<=nrdiv; ++j)
        {
            nr = a[j].d;
            while (x%nr == 0)
            {
                ++Exp[nr];
                x/=nr;
            }
        }
        x = i;
        for (j=1; j<=nrdiv; ++j)
        {
            nr = a[j].d;
            while (x%nr == 0)
            {
                --Exp[nr];
                x/=nr;
            }
        }
        ok = 1;
        for (j=1; j<=nrdiv; ++j)
        {
            if (Exp[a[j].d] < a[j].e)
                ok = 0;
        }
        sol += ok;
    }
}

inline void Write()
{
    ofstream g("pascal.out");
    g<<sol<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}