Cod sursa(job #508417)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 8 decembrie 2010 10:34:43
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>

int I, J, M, D, P, Nr, F[3] = {1, 1, 1}, FI[3];
int ciur[] = {2, 3, 5};

int factori (int X, int D)
{
	int P = 1, N = 0;
	while (P <= X)
		N += X / (P *= D);
	return N;
}

int div (int d)
{
	F[d] = FI[d];
	F[d] -= factori (I - J, ciur[d]);
	F[d] -= factori (J, ciur[d]);
	if (F[d] >= 1) P *= ciur[d];
	if (F[d] >= 2) P *= ciur[d];
}

int main ()
{
	freopen ("pascal.in", "r", stdin);
	freopen ("pascal.out", "w", stdout);
	
	scanf ("%d%d", &I, &D);
	if (D == 2 || D == 4 || D == 6)
		FI[0] = factori (I, ciur[0]);
	if (D == 3 || D == 6)
		FI[1] = factori (I, ciur[1]);
	if (D == 5)
		FI[2] = factori (I, ciur[2]);
	
	M = I / 2;
	if ( !(I & 1) ) M--;	
	for (J = 1; J <= M; ++J)
	{
		P = 1;
		if (D == 2 || D == 4 || D == 6)
			div (0);
		if (D == 3 || D == 6)
			div (1);
		if (D == 5)
			div (2);
		if (P % D == 0) Nr++; 
	}
	
	Nr += Nr;
	
	if ( !(I & 1) )
	{
		J = M + 1;
		P = 1;
		if (D == 2 || D == 4 || D == 6)
			div (0);
		if (D == 3 || D == 6)
			div (1);
		if (D == 5)
			div (2);
		if (P % D == 0) Nr++; 
	}
	
/*	int d;
	for (J = 1; J < I; ++J)
	{
		P = 1;
		for (d = 0; d < 3; ++d)
		{
			F[d] = factori (I, ciur[d]);
			F[d] -= factori (I - J, ciur[d]);
			F[d] -= factori (J, ciur[d]);
			if (F[d] >= 1) P *= ciur[d];
			if (F[d] >= 2) P *= ciur[d];
		}
		if (P % D == 0) Nr++;
	}
*/	
	printf ("%d", Nr);
	
	return 0;
}