Pagini recente » Cod sursa (job #1331097) | Cod sursa (job #2554948) | Cod sursa (job #1724020) | Cod sursa (job #1030537) | Cod sursa (job #40680)
Cod sursa(job #40680)
#include <stdio.h>
#include <math.h>
#define DMAX 100
#define MAX 60
long long r, d;
long long count;
long long pow2[MAX];
long long pow3[MAX];
long long df[DMAX], drf[DMAX];
long long dr[DMAX];
long long di[DMAX];
void make_pow()
{
int i;
pow2[0] = pow3[0] = 1;
for(i = 1; i < MAX; ++i)
{
pow2[i] = pow2[i-1]*2;
pow3[i] = pow3[i-1]*3;
}
}
void desc(long long r, long long di[DMAX])
{
while(!(r%2) && r != 0)
{
++di[2];
r /= 2;
}
while(!(r%3) && r != 0)
{
++di[3];
r /= 3;
}
}
void descfact(long long d, long long df[DMAX])
{
long f, rad, i;
for(f = 0, i = 1; pow2[i] <= d; ++i)
{
f += d/pow2[i];
}
df[2] = f;
for(f = 0, i = 1; pow3[i] <= d; ++i)
{
f += d/pow3[i];
}
df[3] = f;
}
int main()
{
long i;
freopen("pascal.in", "r", stdin);
freopen("pascal.out", "w", stdout);
scanf("%lld %lld\n", &r, &d);
make_pow();
desc(d, di);
descfact(r, dr);
int until = r/2;
for(i = 1; i <= until; ++i)
{
descfact(r-i, drf);
descfact(i, df);
df[2] += drf[2];
df[3] += drf[3];
if((dr[2] - df[2] >= di[2]) && (dr[3] - df[3] >= di[3]))
++count;
}
printf("%lld\n", count*2);
fclose(stdin);
fclose(stdout);
return 0;
}