Pagini recente » Cod sursa (job #3272091) | Cod sursa (job #2744643) | Cod sursa (job #2481462) | Cod sursa (job #1062804) | Cod sursa (job #1758453)
#include <cstdio>
#define NDiv 14
int down[NDiv+1];
int up[NDiv+1];
int f[NDiv+1];
int g[NDiv+1];
int get_exp(int T, int x)
{
int r=x,ans=0;
while( r<=T ) { ans += T/r; r *= x; }
return ans;
}
int main(){
freopen("pascal.in","r",stdin);
freopen("pascal.out","w",stdout);
int N,D,i,j,ans=0,ok=0;
scanf("%d %d",&N,&D);
for(i = 2; i * i <= D; ++i)
{
if( D % i == 0 ) { f[ ++f[0] ] = i; g[ ++g[0] ] = 1; D/=i; }
while( D % i == 0 ) { ++g[ g[0] ]; D/=i; }
}
if( D>1 ) { f[ ++f[0] ] = D; g[ ++g[0] ] = 1; }
for(i = 1; i <= f[0]; ++i) up[i] = get_exp(N, f[i]);
for(i = 1; i < (N+1)/2; ++i)
{
for(j = 1; j <= f[0]; ++j) down[j] = get_exp(i, f[j]) + get_exp(N-i, f[j]);
for(j = 1; j <= f[0]; ++j)
if( up[j]-down[j]<g[j] ) break;
if( j > f[0] ) ++ans;
}
if( N%2==0 )
{
for(j = 1; j <= f[0]; ++j) down[j] = get_exp(N/2, f[j]) + get_exp(N-N/2, f[j]);
for(j = 1; j <= f[0]; ++j)
if( up[j]-down[j]<g[j] ) break;
if( j > f[0] ) ok=1;
}
printf("%d\n",2*ans+ok);
return 0;
}