Pagini recente » Cod sursa (job #679766) | Cod sursa (job #1613413) | Cod sursa (job #1587426) | Cod sursa (job #2782738) | Cod sursa (job #369319)
Cod sursa(job #369319)
#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 ;
}