Cod sursa(job #369319)

Utilizator alutzuAlexandru Stoica alutzu Data 27 noiembrie 2009 22:36:09
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 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;
		}
	}
	return 0 ;
}
long fct ( long n , long x )
{
	long e = 0 ;
	int p =x;
	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;
		while ( n % p == 0 ) 
		{
			++e;
			n/=p;
		}
		return e;
		}
	}
	return 0 ;
}
int main ( )
{
	
	freopen ( "pascal.in" , "r" , stdin ) ;
	freopen ( "pascal.out" , "w" , stdout ) ;
	
	long R , D , nrd , nrd1 , nrd2 , nrdiv = 0 , i ;
	long nr2d , nr2d1 , nr2d2 ; 
	scanf ( "%ld%ld" , & R , & D ) ;
	
	nrd = factor ( R , D ) ;
	nrd1 = 0L ;//factorial de i
	nrd2 = nrd;//factorial (R-i)
	nr2d = factor ( R , 2 ) ;
	nr2d1 = 0L ;
	nr2d2 = nr2d;
	if ( R % 2 == 0 )
	{	
		int lim = (R+1)/2 , ok = 0;
		for ( i=1 ; i <= lim ; ++ i )
		{
			nr2d1 += fct ( i , 2 ) ;
			nr2d2 -= fct ( R-i+1, 2 ) ;
			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 ( i == lim ) ok = 1 ;
				continue;
			}
			if ( D == 6 && nr2d - nr2d1 - nr2d2 > 0 ) 
			{
				++nrdiv;
				if ( i == lim ) ok = 1 ;
				continue;
			}
			if ( D != 4 && D!= 6) 
			{
				nrdiv ++ ;
				if ( i == lim ) ok = 1 ;
			}
		}
		if ( ! ok )
			nrdiv *= 2;
		else
			nrdiv = (nrdiv-1)*2 + 1 ;
	}
	else
	{
		int lim = (R+1)/2 , ok = 0;
		for ( i=1 ; i <= lim ; ++ i )
		{
			nr2d1 += fct ( i , 2 ) ;
			nr2d2 -= fct ( R-i+1, 2 ) ;
			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 ( i == lim ) ok = 1 ;
				continue;
			}
			if ( D == 6 && nr2d - nr2d1 - nr2d2 > 0 ) 
			{
				++nrdiv;
				if ( i == lim ) ok = 1 ;
				continue;
			}
			if ( D != 4 && D!= 6) 
			{
				nrdiv ++ ;
				if ( i == lim ) ok = 1 ;
			}
		}
		nrdiv *= 2;
	}
		
	printf ( "%d" , nrdiv ) ;
	
	return 0 ;
	
}