Cod sursa(job #761977)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 28 iunie 2012 10:37:14
Problema Pascal Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<fstream>
using namespace std;
int n,D,sol;

void Rezolvare1()
{
	int i,x,p,put,lim=n/2;
	//pentru n!
	x=n;
	put=0;
	while(x>=D)
	{
		put+=(x/D);
		x/=D;
	}
	for(i=1;i<=lim;i++)
	{
		p=put;
		//pentru i!
		x=i;
		while(x>=D)
		{
			p-=(x/D);
			x/=D;
		}
		//pentru (n-i)!
		x=n-i;
		while(x>=D)
		{
			p-=(x/D);
			x/=D;
		}
		//trebuie ca D sa apara la o putere > 0
		if(p>0)
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

void Rezolvare2()
{
	int i,x,p,put,lim=n/2;
	//pentru n!
	x=n;
	put=0;
	while(x>=2)
	{
		put+=(x/2);
		x/=2;
	}
	for(i=1;i<=lim;i++)
	{
		p=put;
		//pentru i!
		x=i;
		while(x>=2)
		{
			p-=(x/2);
			x/=2;
		}
		//pentru (n-i)!
		x=n-i;
		while(x>=2)
		{
			p-=(x/2);
			x/=2;
		}
		//trebuie ca sa 2 sa apara la o putere > 1
		if(p>1) 
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

void Rezolvare3()
{
	int i,x,p2,p3,put2,put3,lim=n/2;
	//pentru n! cu D=2
	x=n;
	put2=0;
	while(x>=2)
	{
		put2+=(x/2);
		x/=2;
	}
	//pentru n! cu D=3
	x=n;
	put3=0;
	while(x>=3)
	{
		put3+=(x/3);
		x/=3;
	}
	for(i=1;i<=lim;i++)
	{
		p2=put2;
		//pentru i! cu D=2
		x=i;
		while(x>=2)
		{
			p2-=(x/2);
			x/=2;
		}
		//pentru (n-i)! cu D=2
		x=n-i;
		while(x>=2)
		{
			p2-=(x/2);
			x/=2;
		}
		p3=put3;
		//pentru i! cu D=3
		x=i;
		while(x>=3)
		{
			p3-=(x/3);
			x/=3;
		}
		//pentru (n-i)! cu D=3
		x=n-i;
		while(x>=3)
		{
			p3-=(x/3);
			x/=3;
		}
		//trebuie ca sa 2 si 3 sa apara la o putere > 0
		if(p2>0 && p3>0)
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

int main()
{
	ifstream fin("pascal.in");
	fin>>n>>D;
	fin.close();
	
	if(D==2 || D==3 || D==5)
		Rezolvare1();
	if(D==4)
		Rezolvare2();
	if(D==6)
		Rezolvare3();
	ofstream fout("pascal.out");
	fout<<sol<<"\n";
	fout.close();
	return 0;
}