Cod sursa(job #761976)

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

void Rezolvare1()
{
	int i,x,p,put,lim=n/2,d;
	//pentru n!
	x=n;
	put=0;
	d=D;
	while(x>=d)
	{
		put+=(x/d);
		d*=D;
	}
	for(i=1;i<=lim;i++)
	{
		p=put;
		//pentru i!
		x=i;
		d=D;
		while(x>=d)
		{
			p-=(x/d);
			d*=D;
		}
		//pentru (n-i)!
		x=n-i;
		d=D;
		while(x>=d)
		{
			p-=(x/d);
			d*=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,d;
	//pentru n!
	x=n;
	put=0;
	d=2;
	while(x>=d)
	{
		put+=(x/d);
		d*=2;
	}
	for(i=1;i<=lim;i++)
	{
		p=put;
		//pentru i!
		x=i;
		d=2;
		while(x>=d)
		{
			p-=(x/d);
			d*=2;
		}
		//pentru (n-i)!
		x=n-i;
		d=2;
		while(x>=d)
		{
			p-=(x/d);
			d*=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,d;
	//pentru n! cu D=2
	x=n;
	put2=0;
	d=2;
	while(x>=d)
	{
		put2+=(x/d);
		d*=2;
	}
	//pentru n! cu D=3
	x=n;
	put3=0;
	d=3;
	while(x>=d)
	{
		put3+=(x/d);
		d*=3;
	}
	for(i=1;i<=lim;i++)
	{
		p2=put2;
		//pentru i! cu D=2
		x=i;
		d=2;
		while(x>=d)
		{
			p2-=(x/d);
			d*=2;
		}
		//pentru (n-i)! cu D=2
		x=n-i;
		d=2;
		while(x>=d)
		{
			p2-=(x/d);
			d*=2;
		}
		p3=put3;
		//pentru i! cu D=3
		x=i;
		d=3;
		while(x>=d)
		{
			p3-=(x/d);
			d*=3;
		}
		//pentru (n-i)! cu D=3
		x=n-i;
		d=3;
		while(x>=d)
		{
			p3-=(x/d);
			d*=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;
}