Cod sursa(job #195425)

Utilizator AndreyPAndrei Poenaru AndreyP Data 18 iunie 2008 15:34:53
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
int r,d,rez;
int doi[]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608};
int trei[]={3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907};
int cinci[]={5,25,125,625,3125,15625,78125,390625,1953125,9765625};
int *n;
int calc(int x)
{
	int k=0,i;
	for(i=0; n[i]<=x; i++)
		k+=x/n[i];
	return k;
}
void rezolva()
{
	int k,i,lim,k1;
	k=calc(r);
	lim=r/2+1;
	if(!(r&1))
		lim--;
	for(i=1; i<lim; i++)
	{
		k1=calc(i);
		k1+=calc(r-i);
		if(k1!=k)
			rez+=2;
	}
	if(!(r&1))
	{
		k1=calc(i);
		k1+=calc(r-i);
		if(k1!=k)
			rez++;
	}
}
void rezolva4()
{
	int k,i,lim,k1;
	n=doi;
	k=calc(r);
	lim=r/2+1;
	if(!(r&1))
		lim--;
	for(i=1; i<lim; i++)
	{
		k1=calc(i);
		k1+=calc(r-i);
		k1=k-k1;
		if((k1)&&(!(k1&1)))
			rez+=2;
	}
	if(!(r&1))
	{
		k1=calc(i);
		k1+=calc(r-i);
		k1=k-k1;
		if((k1)&&(!(k1&1)))
			rez++;
	}
}
void rezolva6()
{
	int k2,i,lim,k1,k3;
	n=doi;
	k2=calc(r);
	n=trei;
	k3=calc(r);
	lim=r/2+1;
	if(!(r&1))
		lim--;
	for(i=1; i<lim; i++)
	{
		n=trei;
		k1=calc(i);
		k1+=calc(r-i);
		if(k1!=k3)
		{
			n=doi;
			k1=calc(i);
			k1+=calc(r-i);
			if(k1!=k2)
				rez+=2;
		}
	}
	if(!(r&1))
	{
		n=trei;
		k1=calc(i);
		k1+=calc(r-i);
		if(k1!=k3)
		{
			n=doi;
			k1=calc(i);
			k1+=calc(r-i);
			if(k1!=k2)
				rez++;
		}
	}
}
int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	scanf("%d%d",&r,&d);
	if((r==0)||(r==1))
	{
		printf("0\n");
		return 0;
	}
	switch(d)
	{
		case 2: {n=doi; rezolva();} break;
		case 3: {n=trei; rezolva();} break;
		case 4: rezolva4(); break;
		case 5: {n=cinci; rezolva();} break;
		case 6: rezolva6(); break;
	}
	printf("%d\n",rez);
	return 0;
}