Cod sursa(job #844699)

Utilizator Athena99Anghel Anca Athena99 Data 29 decembrie 2012 18:31:55
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cassert>
#include <cstdio>

int n=0;

int doi(int k)
{
    int i=0,m=k,x=0,nr=2;
    while (m/2>0)
    {
        m/=2;
        ++i;
    }
    m=i;
    for (i=0; i<m; ++i)
    {
        x=x+(k/nr);
        nr=nr+nr;
    }

    return x;
}

int trei(int k)
{
    int i=0,m=k,x=0,nr=3;
    while (m/3>0)
    {
        m/=3;
        ++i;
    }
    m=i;
    for (i=0; i<m; ++i)
    {
        x=x+(k/nr);
        nr=nr+nr+nr;
    }

    return x;
}

int cinci(int k)
{
    int i=0,m=k,x=0,nr=5;
    while (m/5>0)
    {
        m/=5;
        ++i;
    }
    m=i;
    for (i=0; i<m; ++i)
    {
        x=x+(k/nr);
        nr=nr+nr+nr+nr+nr;
    }

    return x;
}

int main()
{
    int d=0,d2=0,d3=0,d5=0,i=0,sol=0,m=0;

    assert(freopen("pascal.in","r",stdin));
    assert(freopen("pascal.out","w",stdout));

    scanf("%d%d",&n,&d);
    m=n/2;

    d2=doi(n);
    d3=trei(n);
    d5=cinci(n);

    for (i=0; i<m; ++i)
        if (d==2 && doi(i)+doi(n-i)<d2)
                sol+=2;
        else if (d==3 && trei(i)+trei(n-i)<d3)
                sol+=2;
        else if (d==4 && doi(i)+doi(n-i)+1<d2)
                sol+=2;
        else if (d==5 && cinci(i)+cinci(n-i)<d5)
                sol+=2;
        else if (d==6 && doi(i)+doi(n-i)<d2 && trei(i)+trei(n-i)<d3)
                sol+=2;

    if (n%2==0)
    {
        if (d==2 && doi(m+1)+doi(n-m-1)<d2)
                ++sol;
        else if (d==3 && trei(m+1)+trei(n-m-1)<d3)
                ++sol;
        else if (d==4 && doi(m+1)+doi(n-m-1)+1<d2)
                ++sol;
        else if (d==5 && cinci(m+1)+cinci(n-m-1)<d5)
                ++sol;
        else if (d==6 && doi(m+1)+doi(n-m-1)<d2 && trei(m+1)+trei(n-m-1)<d3)
                ++sol;
    }

    assert(printf("%d\n",sol));

    return 0;
}