Cod sursa(job #764416)

Utilizator maritimCristian Lambru maritim Data 5 iulie 2012 10:39:46
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>

FILE *f = fopen("pascal.in","r");
FILE *g = fopen("pascal.out","w");

#define MaxD 10

int D,R,Ci,Cf,Sol;
int A[MaxD];

void citire(void)
{
	fscanf(f,"%d %d",&R,&D);
}

inline void AdunaSauScade(int a,int operatie)
{
	if(operatie)
	{
		for(;a%2 == 0;A[2] ++,a /= 2);
		for(;a%3 == 0;A[3] ++,a /= 3);
		for(;a%5 == 0;A[5] ++,a /= 5);
	}
	else
	{
		for(;a%2 == 0;A[2] --,a /= 2);
		for(;a%3 == 0;A[3] --,a /= 3);
		for(;a%5 == 0;A[5] --,a /= 5);
	}
}

inline int Divizibil(int D)
{
	if(D == 2 && A[2])
		return 1;
	if(D == 3 && A[3])
		return 1;
	if(D == 4 && A[2] >= 2)
		return 1;
	if(D == 5 && A[5])
		return 1;
	if(D == 6 && A[2] && A[3])
		return 1;
		
	return 0;
}

void Rezolvare(void)
{	
	Ci = R,Cf = 1;
	
	-- R;
	
	for(int i=1;i<=R/2;i++)
	{
		AdunaSauScade(Ci--,1);
		AdunaSauScade(Cf++,0);
		
		Sol += Divizibil(D);
	}
	
	Sol *= 2;
	
	if(R&1)
	{
		AdunaSauScade(Ci--,1);
		AdunaSauScade(Cf++,0);
		
		Sol += Divizibil(D);
	}
}

int main()
{
	citire();
	Rezolvare();
	
	fprintf(g,"%d\n",Sol);
}