Cod sursa(job #427088)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 27 martie 2010 15:02:48
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<cstdio>
int R,D,nr,fact[1<<23],fact1[1<<23],fact2[1<<23];
void nrf(int f,int x)
{
	fact1[x]=fact1[x-1];
	fact2[x]=fact2[x-1];
	int xo=x;;
	if(f==2 || f==3 || f==5)
	{
		while(x%f==0)
			x/=f , ++fact1[xo];
	}
	if(f==6)
	{
		while(x%2==0)
			x/=2 , ++fact1[xo];		
		while(x%3==0)
			x/=3 , ++fact2[xo];
	}
	if(f==4)
	{
		while(x%4==0)
			x/=4, ++fact1[xo];
		while(x%2==0)
			x/=2 , ++fact2[xo];
	}
}
int min(int x,int y)
{
	if(x<y && x) return x;
	if(x<y && !x) return y;
	if(x>y && y) return y;
	if(x>y && !y) return x;
	return x;
}
int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	scanf("%d%d",&R,&D);
	for(int i=1;i<=R;i++)
		nrf(D,i);
	for(int i=1;i<=R;i++)
	{
		if(D==2 || D==3 || D==5 || D==6)
			fact[i]=min(fact1[i],fact2[i]);
		if(D==4)
			fact[i]=fact1[i]+fact2[i]/2;
	}
	for(int i=1;i<=R;i++)
		if(fact[R]-fact[i]-fact[R-i]>0)
			nr++;
	printf("%d",nr);
	return 0;
}