Pagini recente » Cod sursa (job #3268344) | Cod sursa (job #493057) | Cod sursa (job #618129) | Cod sursa (job #2978112) | Cod sursa (job #369315)
Cod sursa(job #369315)
#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 ;
}