Cod sursa(job #228676)

Utilizator AthanaricCirith Gorgor Athanaric Data 7 decembrie 2008 19:04:16
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <math.h>
#define Size 5000001
int n,d,fact[3],expo[3],nr,expon[Size][2];
void Read()
{
	scanf("%d",&n);
	scanf("%d",&d);
}
void Decompose()
{
	if (d==2||d==3||d==5)
	{
		nr=1;
		fact[1]=d;
		expo[1]=1;
	}
	if (d==4)
	{
		nr=1;
		fact[1]=2;
		expo[1]=2;
	}
	if (d==6)
	{
		nr=2;
		fact[1]=2; fact[2]=3;
		expo[1]=1; expo[2]=1;
	}
}
int Putere(int x, int y)
{
	int put=0;
	while (y%x==0)
	{
		y=y/x;
		put++;
	}
	return put;
}
int Solve()
{
	Decompose();
	int count=0;
	for (int i=1; i<=nr; i++)
		for (int aux=fact[i]; aux<=n; aux*=fact[i]*expo[i],expon[n][i-1]+=n/aux);
	for (int q=n-1; q>=0; q--)
		for (int i=1; i<=nr; i++)
			expon[q][i-1]=expon[q+1][i-1]-Putere(fact[i],q+1);
	for (int q=0; q<=n; q++)
		for (int i=1; i<=nr; i++)
			if (expon[q][i-1]<0)
				expon[q][i-1]=0;
	for (int i=1; i<=nr; i++)
		if (expon[n][i-1]<expo[i])
			return 0;
	for (int q=0; q<=n; q++)
	{
		int ok=1;
		for (int i=1; i<=nr; i++)
			if (expon[n][i-1]<=expon[n-q][i-1]+expon[q][i-1])
				ok=0;
		if (ok)
			count++;
	}
	return count;
}
int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	Read();
	printf("%d ",Solve());
}