Cod sursa(job #185434)

Utilizator AndreyPAndrei Poenaru AndreyP Data 25 aprilie 2008 13:08:36
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
long long n,n1,d,k1,ka,k2,k3,k11,k22,k33,k,rezf;
long long doi[]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608};
long long trei[]={3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907};
long long cinci[]={5,25,125,625,3125,15625,78125,390625,1953125,9765625};
long long afla(long long x,long long *a)
{
	int i=0;
	long long rez=0;
	while(x>=a[i])
	{
		rez=rez+x/a[i];
		i++;
	}
	return rez;
}
void coord2()
{
	long long i;
	for(i=1; i<n1; i++)
	{
		k2=afla(i,doi);
		k3=afla(n-i,doi);
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
	rezf<<=1;
	if(!(n&1))
	{
		k2=afla(n1,doi);
		k3=k2;
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
}
void coord3()
{
	long long i;
	for(i=1; i<n1; i++)
	{
		k2=afla(i,trei);
		k3=afla(n-i,trei);
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
	rezf<<=1;
	if(!(n&1))
	{
		k2=afla(n1,trei);
		k3=k2;
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
}
void coord4()
{
	long long i;
	for(i=1; i<n1; i++)
	{
		k2=afla(i,doi);
		k3=afla(n-i,doi);
		k=k1-k2-k3;
		k>>=1;
		if(k>0)
			rezf++;
	}
	rezf<<=1;
	if(!(n&1))
	{
		k2=afla(n1,doi);
		k3=k2;
		k=k1-k2-k3;
		k>>=1;
		if(k>0)
			rezf++;
	}
}
void coord5()
{
	long long i;
	for(i=1; i<n1; i++)
	{
		k2=afla(i,cinci);
		k3=afla(n-i,cinci);
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
	rezf<<=1;
	if(!(n&1))
	{
		k2=afla(n1,cinci);
		k3=k2;
		k=k1-k2-k3;
		if(k>0)
			rezf++;
	}
}
void coord6()
{
	long long i;
	for(i=1; i<n1; i++)
	{
		k2=afla(i,doi);
		k3=afla(n-i,doi);
		k22=afla(i,trei);
		k33=afla(n-i,trei);
		k=k1-k2-k3;
		ka=k11-k22-k33;
		if((k>0)&&(ka>0))
			rezf++;
	}
	rezf<<=1;
	if(!(n&1))
	{
		k2=afla(n1,doi);
		k3=k2;
		k22=afla(n1,trei);
		k33=k22;
		k=k1-k2-k3;
		ka=k11-k22-k33;
		if((ka>0)&&(k>0))
			rezf++;
	}
}
int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	scanf("%lld%lld",&n,&d);
	n1=n>>1;
	if(n&1)
		n1++;
	if(d==2)
		k1=afla(n,doi);
	else
	if(d==3)
		k1=afla(n,trei);
	else
	if(d==4)
		k1=afla(n,doi);
	else
	if(d==5)
		k1=afla(n,cinci);
	else
	if(d==6)
	{
		k1=afla(n,doi);
		k11=afla(n,trei);
	}
	if(k1==0)
	{
		printf("0\n");
		return 0;
	}
	switch(d)
	{
		case 2: coord2(); break;
		case 3: coord3(); break;
		case 4: coord4(); break;
		case 5: coord5(); break;
		case 6: coord6(); break;
	}
	printf("%lld\n",rezf);
	return 0;
}