Cod sursa(job #1393569)

Utilizator akaprosAna Kapros akapros Data 19 martie 2015 16:20:41
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Nmax 5000005
using namespace std;
int n,i,j,d,f[Nmax],x,y,z,nr,X,Y,Z,F[Nmax];
int sol;
void solve(int f[Nmax])
{
    if (f[i]!=-1) y=f[i];
        else
        {
             nr=i;
             while (nr)
             y+=(nr/d),nr=nr/d;
             f[i]=y;
        }
        if (f[n-i]!=-1) z=f[n-i];
        else
        {
             nr=n-i;
             while (nr)
             z+=(nr/d),nr=nr/d;
             f[n-i]=z;
        }
}
int main()
{
    freopen("pascal.in","r",stdin);
    freopen("pascal.out","w",stdout);
    scanf("%d %d",&n,&d);
    nr=n;
    memset(f,-1,sizeof(f));
    if (d==6)
    { d=2;
    while (nr)
    x+=(nr/d),nr=nr/d;
    f[n]=x;
    d=3;
    while (nr)
    X+=(nr/d),nr=nr/d;
    F[n]=X;
    }
    else if (d==4)
    {
        d=2;
    while (nr)
    x+=(nr/d),nr=nr/d;
    f[n]=x;
    d=2;
    while (nr)
    X+=(nr/d),nr=nr/d;
    F[n]=X;
    }else
    {
        while (nr)
    x+=(nr/d),nr=nr/d;
    f[n]=x;
    }
    f[0]=0; F[0]=0;
    for (i=1;i<n;i++)
    {
        y=0; z=0; Y=0; Z=0;
        if (d==6)
        {
            d=2; solve(f);
            Y=y; Z=z;
            d=3; solve(F);
            swap(y,Y); swap(z,Z);
        }
        else if (d==4)
        {
            d=2;
            solve(f);
            d=2; solve(F);
            swap(y,Y); swap(z,Z);
        }else solve(f);
        if (x>y+z && (X>Y+Z || d!=4 || d!=6))
        ++sol;
    }
    printf("%d",sol);
    return 0;
}