Mai intai trebuie sa te autentifici.

Cod sursa(job #195440)

Utilizator AndreyPAndrei Poenaru AndreyP Data 18 iunie 2008 16:32:37
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
int r,d,rez,lim;
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,k1=0,g1,g2,k2,k3,d1=d-1;
	k=calc(r);
	lim=r/2+1;
	if(!(r&1))
		lim--;
	g1=1;
	g2=r%d;
	k2=calc(r-1);
	k3=k2;
	for(i=1; i<lim; i++)
	{
		if(!g1)
		{
			k3-=k1;
			k1=calc(i);
			k3+=k1;
		}
		else
		{
			if(g1==d1)
				g1=0;
			else
				g1++;
		}
		if(!g2)
		{
			k3-=k2;
			k2=calc(r-i);
			k3+=k2;
		}
		else
		{
			if(g2==0)
				g2=d1;
			else
				g2--;
		}
		if(k!=k3)
			rez+=2;
	}
	if(!(r&1))
	{
		k1=calc(i);
		k1+=calc(r-i);
		if(k!=k1)
			rez++;
	}
}
void rezolva4()
{
	int k,i,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;
		k1>>=1;
		if(k1)
			rez+=2;
	}
	if(!(r&1))
	{
		k1=calc(i);
		k1+=calc(r-i);
		k1=k-k1;
		k1>>=1;
		if(k1)
			rez++;
	}
}
void rezolva6()
{
	int k2,i,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(k3!=k1)
		{
			n=doi;
			k1=calc(i);
			k1+=calc(r-i);
			if(k2!=k1)
				rez+=2;
		}
	}
	if(!(r&1))
	{
		n=trei;
		k1=calc(i);
		k1+=calc(r-i);
		if(k3!=k1)
		{
			n=doi;
			k1=calc(i);
			k1+=calc(r-i);
			if(k2!=k1)
				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;
}