Cod sursa(job #427099)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 27 martie 2010 15:20:51
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 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%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 min1(int x,int y)
{
	return x<y?x:y;
}
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)
			fact[i]=min(fact1[i],fact2[i]);
		if(D==4)
			fact[i]=fact2[i];
	}
	for(int i=1;i<=R;i++)
	{
		if(D==2 || D==3 || D==5)
			if(fact[R]-fact[i]-fact[R-i]>0)
				nr++;
		if(D==4) 
			if((fact[R]-fact[i]-fact[R-i])/2>0)
				nr++;
		if(D==6)
			if(min1(fact1[R]-fact1[i]-fact1[R-i],fact2[R]-fact2[i]-fact2[R-i])>0)
				nr++;
	}
	printf("%d",nr);
	return 0;
}