Cod sursa(job #369315)

Utilizator alutzuAlexandru Stoica alutzu Data 27 noiembrie 2009 22:21:04
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>

long factor ( long n , long x ) 
{
	long e= 0L , p = x ;
	if ( x == 2 || x == 3 || x == 5 )
	{
		while ( n / p )
		{
			e+=n/p;
			p*=x;
		}
		return e ;
	}
	switch (x)
	{
	case 4: {
		p=2;
		while ( n / p ) 
		{
			e+=n/p;
			p*=2;
		}
		return e;
		}
	case 6: {
		p=3;
		while ( n / p ) 
		{
			e+=n/p;
			p*=3;
		}
		return e;
		}
	}
}
long fct ( long n , long x )
{
	long e = 0 ;
	int p ;
	if ( !n ) return 0 ;

	if ( x == 2 || x == 3 || x == 5 )
	{
		while ( n % p == 0 )
		{
			++e;
			n/=p;
		}
		return e ;
	}
	
	switch (x)
	{
	case 4: {
		p=2;
		while ( n % p ==0) 
		{
			++e;
			n/=p;
		}
		return e;
		}
	case 6: {
		p=3;
		int nn = n ;
		while ( n % p == 0 ) 
		{
			++e;
			n/=p;
		}
		int e1 = 0 ;
		p=2;
		n = nn ;
		while ( n % p == 0 )
		{
			++e1;
			n/=p;
		}
		if ( e1 > e ) return e;
		return e1;
		}
	}
}
int main ( )
{
	
	freopen ( "pascal.in" , "r" , stdin ) ;
	freopen ( "pascal.out" , "w" , stdout ) ;
	
	long R , D , nrd , nrd1 , nrd2 , nrdiv = 0 , i ;
	
	scanf ( "%ld%ld" , & R , & D ) ;
	
	nrd = factor ( R , D ) ;
	nrd1 = 0L ;//factorial de i
	nrd2 = nrd;//factorial (R-i)
	for ( i=1 ; i < R ; ++ i )
	{
		nrd1 += fct ( i , D ) ;
		if ( nrd1 > nrd ) continue;
		nrd2 -= fct (R-i+1, D) ;
		if ( nrd1 + nrd2 >= nrd ) continue;
		if ( D == 4 && nrd - nrd1 - nrd2 >= 2 ) ++nrdiv;
		if ( D != 4 ) nrdiv ++ ;
	}
	
	printf ( "%d" , nrdiv ) ;
	
	return 0 ;
	
}