Cod sursa(job #217048)

Utilizator Mishu91Andrei Misarca Mishu91 Data 26 octombrie 2008 20:28:10
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

long N, Sol;
int D;

inline long min(long a, long b)
{
    return (a < b)? a : b;
}

long log(int baza, long nr)
{
    long put = 0;

    while(1)
    {
        if(nr % baza)
            return put;
        nr /= baza;
        put++;
    }
}

void solve()
{
    int L = N >> 1;
    long Ant = 0, Act;
    for(int i = 1; i <= L; ++i)
    {
        if(D == 4)
            Act = Ant + ((log(2, N - i + 1) - log(2, i)) >> 1);
        else if(D == 6)
            Act = Ant + min((log(2, N - i + 1) - log(2, i)), (log(3, N - i + 1) - log(3, i)));
        else
            Act = Ant + log(D, N - i + 1) - log(D, i);
        if(Act)
            ++Sol;
        Ant = Act;
    }
    if(N & 1)
    {
        printf("%ld\n",2 * Sol);
        return;
    }
    if(Act)
        printf("%ld\n",2 * Sol - 1);
    else
        printf("%ld\n",2 * Sol);
}

int main()
{
    freopen("pascal.in","rt",stdin);
    freopen("pascal.out","wt",stdout);

    scanf("%ld %d",&N, &D);
    solve();
}