Pagini recente » Scrie articole | Istoria paginii preoni-2004/runda-1/clasament-9-10 | Clasamentul arhivei ACM | Solutii preONI 2006 - Runda a 3-a | Cod sursa (job #217070)
Cod sursa(job #217070)
#include <cstdio>
long long N, Sol;
int D;
inline long min(long a, long b)
{
return (a < b)? a : b;
}
long long log(int baza, long long nr)
{
long put = 0;
while(1)
{
if(nr % baza)
return put;
nr /= baza;
put++;
}
}
void solve()
{
int L = N >> 1;
long long Ant = 0, Act, Ant2 = 0, Act2;
for(int i = 1; i <= L; ++i)
{
if(D == 4)
Act = Ant + ((log(2, N - i + 1) - log(2, i)) >> 1), Act2 = 1;
else if(D == 6)
{
Act = Ant + log(2, N - i + 1) - log(2, i);
Act2 = Ant2 + log(3, N - i + 1) - log(3, i);
}
else
Act = Ant + log(D, N - i + 1) - log(D, i), Act2 = 1;
if(Act && Act2)
++Sol;
Ant = Act;
Ant2 = Act2;
}
if(N & 1)
{
printf("%lld\n",2 * Sol);
return;
}
if(Act && Act2)
printf("%lld\n",2 * Sol - 1);
else
printf("%lld\n",2 * Sol);
}
int main()
{
freopen("pascal.in","rt",stdin);
freopen("pascal.out","wt",stdout);
scanf("%lld %d",&N, &D);
solve();
}