Cod sursa(job #811793)

Utilizator ChallengeMurtaza Alexandru Challenge Data 12 noiembrie 2012 22:19:08
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>

using namespace std;

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

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

int n,d,p2,p3,p5,r2,r3,r5,sol,tr2,tr3,tr5,legendre2[MaxR],legendre3[MaxR],legendre5[MaxR];

inline int legendre(int x,int p)
{
	int sol(0);
	int pp=p;
	while(x/pp)
	{
		sol+=x/pp;
		pp*=p;
	}
	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;
	}

	for(register int i=2;i<=((n+1)>>1)+1;++i)
	{
		legendre2[i]=legendre(i,2);
		legendre3[i]=legendre(i,3);
		legendre5[i]=legendre(i,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-legendre2[j]-legendre2[n-j];
		p3=tr3-legendre3[j]-legendre3[n-j];
		p5=tr5-legendre5[j]-legendre5[n-j];
		if(p2>=r2 && p3>=r3 && p5>=r5)
		{
			sol+=2;
		}
	}

	if((n-1)%2==1)
	{
		int j=((n+1)>>1)+1;
		p2=tr2-legendre2[j]-legendre2[n-j];
		p3=tr3-legendre3[j]-legendre3[n-j];
		p5=tr5-legendre5[j]-legendre5[n-j];
		if(p2>=r2 && p3>=r3 && p5>=r5)
		{
			++sol;
		}
	}

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