Cod sursa(job #444522)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 20 aprilie 2010 18:12:37
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#define Inf 1<<30
#define Rmax 5000010

int f[10],i,j,d,D,R,S,m,sol,dp[5],aux,P,Desc,Sc,Fact[2][Rmax]; 


int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	
	scanf("%d %d",&R,&D);
	
	
	if(R<=1) {printf("0"); return 0;}
	
	for(d=2;d<=D;d++)
	{
		if(D%d==0)
		{
			dp[P]=d;
			while(D%d==0)
			{
				f[P]++;
				D/=d;
			}
			P++;
		}
	}
	
	for(i=0;i<P;i++)
		for(j=1;j<=R;j++)
		{
			aux=j; S=0; 
			while(aux%dp[i]==0) {S++; aux/=dp[i];}
			Fact[i][j]=Fact[i][j-1]+S;
		}
	
	Desc=Inf;
	for(i=0;i<P;i++)
	{
		S=Fact[i][R]/f[i];
		if(S<Desc) Desc=S;
	}
	
	m=R>>1;
	
	for(i=1;i<=m;i++)
	{
		Sc=Inf;
		for(j=0;j<P;j++)
		{
			S=(Fact[j][i]+Fact[j][R-i])/f[j];
			if(S<Sc) Sc=S;
		}
		
		if(Desc-Sc>0) sol++;
	}
	sol<<=1;
		
	if(!(R&1))
	{
		Sc=Inf;
		for(i=0;i<P;i++)
		{	
			S=2*Fact[i][m]/f[i];
			if(S<Desc) Sc=S;
		}
		if(Desc-Sc>0) sol--;
	}
	
	printf("%d",sol);
	return 0;
}