Cod sursa(job #844699)
#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;
}