Pagini recente » Cod sursa (job #1017753) | Cod sursa (job #3138725) | Cod sursa (job #674327) | Cod sursa (job #974374) | Cod sursa (job #1235825)
#include<cstdio>
#include<iostream>
#define Nmax 5000010
using namespace std;
int dp[2], f[2], F[2], Left[2], Right[2], fact[2][Nmax];
int R, D, P, i, j, d, sol;
int main() {
freopen("pascal.in", "r", stdin);
freopen("pascal.out", "w", stdout);
scanf("%d %d", &R, &D);
for (d = 2 ; d <= D ; d++) {
if (D % d == 0) {
dp[P] = d;
while (D % d == 0) { f[P]++; D /= d; }
P++;
}
}
for (i = 0 ; i < P ; i++) {
d = dp[i];
for (j = 1 ; j <= R ; j++) {
int aux = j;
while (aux % d == 0) { fact[i][j]++; aux /= d; }
}
while (d <= R) {
int aux = R;
while (aux % d == 0) { F[i]++; aux /= d; }
d *= dp[i];
}
}
for (i = 0 ; i < P ; i++)
Left[i] = 0, Right[i] = F[i];
int M = R >> 1;
bool last = false;
for (j = 0 ; j <= M ; j++) {
bool ok = true;
for (i = 0 ; i < P ; i++) {
int r = F[i] - Left[i] - Right[i];
if (r < f[i]) ok = false;
Left[i] += fact[i][j + 1];
Right[i] -= fact[i][R - j];
}
if (ok) { sol++; if (j == M) last = true; }
}
sol <<= 1;
if (!(R&1) && last) sol--;
printf("%d\n", sol);
return 0;
}