#include #include #include using namespace std; typedef long long int lli; int rozklad[432][432]; int rprimes[432][50]; int rozkladnk[432]; bool isprime[432]; int fact[432][432]; int main(void) { int i, j, k, n, t, p; lli vysl; for (i = 0; i < 432; i++) { isprime[i] = true; } isprime[0] = false; isprime[1] = false; p = 2; while (i < 432) { while (!isprime[p]) p++; i = 2*p; while (i < 432) { isprime[i] = false; i += p; } i = p + 1; } int rofs; for (i = 0; i < 432; i++) { memset(fact[i], 0, sizeof(fact[i])); t = i; rprimes[i][1] = 0; rofs = 0; for (j = 2; j < 432; j++) { rozklad[i][j] = 0; if (isprime[j]) { while (t > 0 && t%j == 0) { rozklad[i][j]++; if (j != rprimes[i][rofs]) { rofs++; rprimes[i][rofs] = j; } t /= j; } } } rprimes[i][0] = rofs; if (i > 0) { for (j = 0; j < 432; j++) { fact[i][j] = fact[i - 1][j] + rozklad[i][j]; } } } int nprimes; while (scanf("%d %d", &n, &k) == 2) { for (j = 0; j < 432; j++) { rozkladnk[j] = fact[n][j] - fact[n - k][j] - fact[k][j]; } /* for (i = n; i > n - k; i--) { nprimes = rprimes[i][0]; for (j = 0; j < nprimes; j++) { p = rprimes[i][j + 1]; rozkladnk[p] += rozklad[i][p]; } } */ /* for (i = 0; i < 6; i++) cout << rozkladnk[i] << " "; cout << endl; */ /* for (i = 1; i <= k; i++) { nprimes = rprimes[i][0]; for (j = 0; j < nprimes; j++) { p = rprimes[i][j + 1]; rozkladnk[p] -= rozklad[i][p]; } } */ /* for (i = 0; i < 6; i++) cout << rozkladnk[i] << " "; cout << endl; */ vysl = 1; for (i = 2; i < 432; i++) vysl *= rozkladnk[i] + 1; cout << vysl << endl; } return 0; }