Cod sursa(job #33457)
#include <cstdio>
#include <cmath>
#define FIN "chernel.in"
#define FOUT "chernel.out"
#define MAX 1000000
#define PRIM_MAX 50000
#define MAXSIZE MAX/16+1
#define MAX_N 100000
long prim[PRIM_MAX], nr, ans;
long putere[PRIM_MAX];
long N,M;
char v[MAXSIZE];
void ciur(long n) {
long i,j;
for (i=1; ((i*i)<<1) + (i<<1) <= n; i++)
if ( (v[i>>3] & (1<< (i&7)))==0 )
for (j=((i*i)<<1)+(i<<1); (j<<1) + 1 <=n; j+=(i<<1) + 1)
v[j>>3] |= (1<<(j&7));
if ( M%2==0 )
prim[nr=0] = 2;
else
nr=-1;
for (i=1; (i<<1)+1<=n; ++i)
if ( ((v[i>>3] & (1<<(i&7))) ==0) && (M%((i<<1)+1)==0) ) {
prim[++nr] = (i<<1)+1;
}
}
//long fact[50][MAX_N];
long f(long x, long y) {
long ret;
for (ret = 0; x>=y; ret+=(x/=y));
return ret;
}
int main() {
long i, j, ok=0;
fscanf( fopen(FIN, "r") , "%ld %ld", &N, &M);
N--;
ciur((long) sqrt((double)M));
for (i=0; i<=nr; ++i)
for (putere[i]=0; M % prim[i]==0; putere[i]++, M/=prim[i]);
if ( M>1 )
prim[++nr]=M, putere[nr]=1;
/*
for (j=0; j<=nr; ++j)
for (i=1; i<=N; ++i)
fact[j][i] = fact[j][i-1] + f(i,prim[j]);
*/
for (i=1; i<=N/2; ++i) {
ok = 1;
for (j=0; j<=nr && ok; ++j)
// if ( putere[j] > fact[j][N] - fact[j][N-i] - fact[j][i] )
if ( putere[j] > f(N, prim[j]) - f(N-i, prim[j]) - f(i, prim[j]))
ok = 0;
ans += ok;
}
ans *= 2;
if ( N%2==0 && ok )
ans--;
fprintf( fopen(FOUT, "w"), "%ld\n", ans);
return 0;
}