Cod sursa(job #228635)

Utilizator AthanaricCirith Gorgor Athanaric Data 7 decembrie 2008 17:45:24
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <math.h>
#define Size 5000000
int n,d,fact[2],expo[2],nr,expon[Size][2];
void Read()
{
	scanf("%d",&n);
	scanf("%d",&d);
}
int Prim()
{
	for (int i=2; i<=sqrt(d); i++)
		if (d%i==0)
			return 1;
	return 0;
}
void Decompose()
{
	int k=2,val=sqrt(d); nr=1;
	if (!Prim())
	{
		fact[1]=d;
		expo[1]=1;
	}
	else
	while (k<=val)
	{
		if (d%k==0)
		{
			fact[nr]=k;
			while (d%k==0)
			{
				d=d/k;
				expo[nr]++;
			}
			nr++;
		}
		k++;
		nr--;
	}
	
}
int Solve()
{
	Decompose();
	int count=0;	for (int i=1; i<=nr; i++)
		for (int aux=1; aux<=n; aux*=fact[i],expon[n][i-1]+=n/aux);
	for (int i=1; i<=nr; i++)
		if (expon[n][i-1]<expo[i-1])
			return 0;
	for (int q=0; q<=n-1; q++)
		for (int i=1; i<=nr; i++)
			for (int aux=1; aux<=q; aux*=fact[i],expon[q][i-1]+=q/aux);
	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());
}