Cod sursa(job #504171)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 noiembrie 2010 21:39:36
Problema Pascal Scor 80
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 desc(int x,int p)
{
	int sol(0);
	while(x%p==0)
	{
		x/=p;
		++sol;
	}
	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;++i)
	{
		legendre2[i]=legendre2[i-1]+desc(i,2);
		legendre3[i]=legendre3[i-1]+desc(i,3);
		legendre5[i]=legendre5[i-1]+desc(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;
}