Cod sursa(job #509158)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 10 decembrie 2010 16:44:45
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

int I, J, M, D, P, C, Nr, FI[3], F[3][25];//00000];
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 factori1 (int X, int D)
{
	int N = 0;
	while (X % D == 0)
		++N, X /= D;
	return N;
}

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

int main ()
{
	freopen ("pascal.in", "r", stdin);
	freopen ("pascal.out", "w", stdout);
	
	scanf ("%d%d", &I, &D);

	M = I / 2;
	for (J = 1; J <= M + 1; ++J)
	{
		if (D == 2 || D == 4 || D == 6)
			F[0][J] = F[0][J - 1] + factori1 (J, ciur[0]);
		if (D == 3 || D == 6)
			F[1][J] = F[1][J - 1] + factori1 (J, ciur[1]);
		if (D == 5)
			F[2][J] = F[2][J - 1] + factori1 (J, ciur[2]);
	}
	
	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]);	
	
	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++;
	}	
	
	printf ("%d", Nr);
	
	return 0;
}