Cod sursa(job #603912)

Utilizator SteveStefan Eniceicu Steve Data 19 iulie 2011 12:48:00
Problema Pascal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.09 kb
#include <fstream.h>

long total=0;

void doi (long numar)
{
	long i, aux, ptR=0, primul, doilea, auxiliar;
	aux=numar;
	while (aux)
	{
		aux>>=1;
		ptR+=aux;
	}
	if (numar & 1)
	{
		auxiliar=numar>>1;
		for (i=1; i<=auxiliar; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
	}
	else
	{
		auxiliar=numar>>1;
		for (i=1; i<auxiliar; i++)
		{
			aux=i;
			primul=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=numar-i;
			doilea=0;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
		primul=0;
		aux=numar>>1;
		while (aux)
		{
			aux>>=1;
			primul+=aux;
		}
		if (ptR > (primul<<1)) total++;
	}
}

void trei (long numar)
{
	long i, aux, ptR=0, primul, doilea, miu;
	aux=numar;
	while (aux)
	{
		aux/=3;
		ptR+=aux;
	}
	if (numar & 1)
	{
		miu=numar>>1;
		for (i=1; i<=miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux/=3;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=3;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
	}
	else
	{
		miu=numar>>1;
		for (i=1; i<miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux/=3;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=3;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
		primul=0;
		aux=numar>>1;
		while (aux)
		{
			aux/=3;
			primul+=aux;
		}
		if (ptR > (primul<<1)) total++;
	}
}

void cinci (long numar)
{
	long i, aux, ptR=0, primul, doilea, miu;
	aux=numar;
	while (aux)
	{
		aux/=5;
		ptR+=aux;
	}
	if (numar & 1)
	{
		miu=numar>>1;
		for (i=1; i<=miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux/=5;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=5;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
	}
	else
	{
		miu=numar>>1;
		for (i=1; i<miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux/=5;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=5;
				doilea+=aux;
			}
			if (ptR > primul+doilea) total+=2;
		}
		primul=0;
		aux=numar>>1;
		while (aux)
		{
			aux/=5;
			primul+=aux;
		}
		if (ptR > (primul<<1)) total++;
	}
}

void patru (long numar)
{
	long i, aux, ptR=0, primul, doilea, miu;
	aux=numar;
	while (aux)
	{
		aux>>=1;
		ptR+=aux;
	}
	if (numar & 1)
	{
		miu=numar>>1;
		for (i=1; i<=miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			if (ptR > primul+doilea+1) total+=2;
		}
	}
	else
	{
		miu=numar>>1;
		for (i=1; i<miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			if (ptR > primul+doilea+1) total+=2;
		}
		primul=0;
		aux=numar>>1;
		while (aux)
		{
			aux>>=1;
			primul+=aux;
		}
		if (ptR > (primul<<1)+1) total++;
	}
}

void sase (long numar)
{
	long i, aux, ptR=0, ptR2=0, primul, doilea, primul2, doilea2, miu;
	aux=numar;
	while (aux)
	{
		aux>>=1;
		ptR+=aux;
	}
	aux=numar;
	while (aux)
	{
		aux/=3;
		ptR2+=aux;
	}
	miu=numar>>1;
	if (numar & 1)
	{
		for (i=1; i<=miu; i++)
		{
			aux=i;
			primul=0;
			doilea=0;
			primul2=0;
			doilea2=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=i;
			while (aux)
			{
				aux/=3;
				primul2=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=3;
				doilea2+=aux;
			}
			if ((ptR > primul+doilea) && (ptR2 > primul2+doilea2)) total+=2;
		}
	}
	else
	{
		for (i=1; i<miu; i++)
		{
			aux=i;
			primul=0;
			primul2=0;
			doilea=0;
			doilea2=0;
			while (aux)
			{
				aux>>=1;
				primul+=aux;
			}
			aux=i;
			while (aux)
			{
				aux/=3;
				primul2+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux>>=1;
				doilea+=aux;
			}
			aux=numar-i;
			while (aux)
			{
				aux/=3;
				doilea2+=aux;
			}
			if ((ptR > primul+doilea) && (ptR2 > primul2+doilea2)) total+=2;
		}
		primul=0;
		aux=numar>>1;
		while (aux)
		{
			aux>>=1;
			primul+=aux;
		}
		primul2=0;
		aux=numar>>1;
		while (aux)
		{
			aux/=3;
			primul2+=aux;
		}
		if ((ptR > (primul<<1)) && (ptR2 > (primul2<<1))) total++;
	}
}

int main()
{
	long primu1, primu2, doilea1, doilea2, R;
	int D;
	ifstream fin;
	fin.open ("pascal.in");
	fin>>R>>D;
	fin.close();
	if (D == 6) sase (R);
	else
	{
		if (D == 5) cinci (R);
		else
		{
			if (D == 4) patru (R);
			else
			{
				if (D == 3) trei (R);
				else doi (R);
			}
		}
	}
	ofstream fout;
	fout.open ("pascal.out");
	fout<<total;
	fout.close();
	return 0;
}