Cod sursa(job #504167)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 noiembrie 2010 21:15:42
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>

using namespace std;

const char InFile[]="pascal.in";
const char OutFile[]="pascal.out";

ifstream fin(InFile);
ofstream fout(OutFile);

int n,d,p2,p3,p5,r2,r3,r5,sol,tr2,tr3,tr5;

inline int legendre(int x,int p)
{
	int d=p;
	int l=x/d;
	int sol=0;
	while(l)
	{
		sol+=l;
		d*=p;
		l=x/d;
	}
	return sol;
}

int main()
{
	fin>>n>>d;
	fin.close();

	while(d%2==0)
	{
		++r2;
		d/=2;
	}

	while(d%3==0)
	{
		++r3;
		d/=3;
	}

	while(d%5==0)
	{
		++r5;
		d/=5;
	}

	tr2=legendre(n,2);
	tr3=legendre(n,3);
	tr5=legendre(n,5);

	for(register int j=1;j<(n+1)>>1;++j)
	{
		p2=tr2-legendre(j,2)-legendre(n-j,2);
		p3=tr3-legendre(j,3)-legendre(n-j,3);
		p5=tr5-legendre(j,5)-legendre(n-j,5);
		if(p2>=r2 && p3>=r3 && p5>=r5)
		{
			sol+=2;
		}
	}

	if((n-1)%2==1)
	{
		int j=((n+1)>>1)+1;
		p2=tr2-legendre(j,2)-legendre(n-j,2);
		p3=tr3-legendre(j,3)-legendre(n-j,3);
		p5=tr5-legendre(j,5)-legendre(n-j,5);
		if(p2>=r2 && p3>=r3 && p5>=r5)
		{
			++sol;
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}