Cod sursa(job #71332)

Utilizator scapryConstantin Berzan scapry Data 10 iulie 2007 10:56:47
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>

enum { divs = 3 };
const int div[divs] = { 2, 3, 5 };

int base;
int want[divs];
int ans;

void decomp(int val, int d[divs])
{
	d[0] = 0;
	d[1] = 0;
	d[2] = 0;

	while(val % 2 == 0)
	{
		d[0]++;
		val /= 2;
	}

	while(val % 3 == 0)
	{
		d[1]++;
		val /= 3;
	}

	while(val % 5 == 0)
	{
		d[2]++;
		val /= 5;
	}
}

inline void multiply(int a[divs], const int b[divs])
{
	a[0] += b[0];
	a[1] += b[1];
	a[2] += b[2];
}

inline void divide(int a[divs], const int b[divs])
{
	a[0] -= b[0];
	a[1] -= b[1];
	a[2] -= b[2];
}

inline bool divides(const int a[divs], const int b[divs])
{
	return (a[0] >= b[0]) && (a[1] >= b[1]) && (a[2] >= b[2]);
}

void go()
{
	int i, cur[divs], tmp[divs];
	decomp(1, cur); //C(0, base)

	for(i = 1; i < (base + 1) / 2; i++) //C(i, base) and C(base - i, base)
	{
		decomp(base - i + 1, tmp);
		multiply(cur, tmp);
		decomp(i, tmp);
		divide(cur, tmp);

		if(divides(cur, want))
			ans++;

		//printf("i %d. cur %d %d %d\n", i, cur[0], cur[1], cur[2]);
	}

	printf("half ans %d\n", ans);
	ans *= 2;

	if((base + 1) % 2) //one more, in the middle, C(base/2, base)
	{
		i = base / 2;

		decomp(base - i + 1, tmp);
		multiply(cur, tmp);
		decomp(i, tmp);
		divide(cur, tmp);

		if(divides(cur, want))
			ans++;

		//printf("i %d. cur %d %d %d\n", i, cur[0], cur[1], cur[2]);
	}

	printf("final ans %d\n", ans);
}

int main()
{
	int tmp;
	FILE *f = fopen("pascal.in", "r");
	if(!f) return 1;

	fscanf(f, "%d%d", &base, &tmp);
	decomp(tmp, want);

	fclose(f);
	f = fopen("pascal.out", "w");
	if(!f) return 1;

	go();

	fprintf(f, "%d\n", ans);
	fclose(f);
	return 0;
}