Cod sursa(job #444509)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 20 aprilie 2010 17:14:07
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
#define Min(a,b) a < b  ? a : b
#define Inf 1<<30
#define Rmax 5000010

int f[10],i,j,d,D,R,S,m,sol,dp[5],aux,P,v[Rmax],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[d]++;
				D/=d;
			}
		}
	}
	

	for(i=0;i<P;i++)
		for(j=1;j<=R;j++)
		{
			aux=j; S=0; 
			while(aux%dp[i+1]==0) {S++; aux/=dp[i+1];}
			Fact[i][j]=Fact[i][j-1]+S;
		}
	
	for(j=1;j<=R;j++)
	{
		v[j]=Inf;
		for(i=0;i<P;i++)		
		{
			Fact[i][j]/=f[dp[i+1]];	
			if(Fact[i][j]<v[j]) v[j]=Fact[i][j];
		}
	}
	
	m=R>>1;
	
	for(i=1;i<=m;i++)
		if(v[R]-v[i]-v[R-i]>0) sol++;
	sol<<=1;
		
	if(!(R&1))
	{
		if(v[R]-2*v[m]>0) sol--;
	}
	
	printf("%d",sol);
	return 0;
}