Cod sursa(job #504168)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 noiembrie 2010 21:26:01
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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 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;
	}

	for(register int i=0;i<=n;++i)
	{
		legendre2[i]=legendre(i,2);
		legendre3[i]=legendre(i,3);
		legendre5[i]=legendre(i,5);
	}

	tr2=legendre2[n];
	tr3=legendre3[n];
	tr5=legendre5[n];

	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;
}