Pagini recente » Cod sursa (job #2118238) | Cod sursa (job #626997) | Cod sursa (job #3269205) | Cod sursa (job #1252841) | Cod sursa (job #1758996)
#include <cstdio>
#define VMax 5000005
#define NDiv 2
char in[NDiv+1][VMax+1];
int down[NDiv+1];
int up[NDiv+1];
int f[NDiv+1];
int g[NDiv+1];
int N,D;
int get_exp(int T, int x)
{
int r=x,ans=0;
while( r<=T ) { ans += T/r; r *= x; }
return ans;
}
void Factz()
{
int i;
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; }
}
void Precalc()
{
int i,j;
for(i = 1; i <= N; ++i)
for(j = 1; j <= f[0]; ++j)
if( i % f[j] == 0 ) in[j][i] = 1 + in[j][i/f[j]];
for(i = 1; i <= f[0]; ++i) down[i] = up[i] = get_exp(N, f[i]);
}
int main(){
freopen("pascal.in","r",stdin);
freopen("pascal.out","w",stdout);
int i,j,ans=0,ok=0;
scanf("%d %d",&N,&D);
Factz();
Precalc();
for(i = 1; i < (N+1)/2; ++i)
{
for(j = 1; j <= f[0]; ++j)
down[j] += in[j][i] - in[j][N-i+1];
for(j = 1; j <= f[0]; ++j)
if( up[j]-down[j]<g[j] ) break;
if( j > f[0] ) ++ans;
}
if( (N+1)&1 )
{
for(j = 1; j <= f[0]; ++j)
down[j] += in[j][i] - in[j][N-i+1];
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;
}