Cod sursa(job #40646)

Utilizator peanutzAndrei Homorodean peanutz Data 27 martie 2007 16:43:23
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <math.h>

#define DMAX 6
#define MAX 40

long r, d;
long count;

long long pow2[MAX];
long long pow3[MAX];

long df[DMAX], drf[DMAX];
long dr[DMAX];
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 r, long di[DMAX])
{
	while(!(r%2) && r != 0)
	{
		++di[2];
		r /= 2;
	}
	while(!(r%3) && r != 0)
	{
		++di[3];
		r /= 3;
	}
}

void descfact(long d, long df[DMAX])
{
	long f, rad, i;

	for(f = 0, rad = sqrt(d), i = 1; i <= rad; ++i)
	{
		f += d/pow2[i];
	}

	df[2] = f;

	for(f = 0, rad = sqrt(d), i = 1; i <= rad; ++i)
	{
		f += d/pow3[i];
	}
	df[3] = f;
}

int main()
{
	long i;
	freopen("pascal.in", "r", stdin);
	freopen("pascal.out", "w", stdout);

	scanf("%ld %ld\n", &r, &d);

	make_pow();

	desc(d, di);

	descfact(r, dr);

	for(i = 1; i <= r; ++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("%ld\n", count);

	fclose(stdin);
	fclose(stdout);

	return 0;
}