#include <cstdio>
int n, m, k, v;
int pr[200005], pn, pl[200005], bn, cnt[30005];
long long d[30005 * 3]; //binary indexed tree
long long X, Y;
long long mul(int a, int b) {
X = 1; Y = a;
while (b) {
if (b & 1) X = (X*Y) % m;
Y *= Y; b /= 2;
}
return X;
}
void upd(int x, int y) {
cnt[x] += y;
d[bn + x] = mul(pr[x], cnt[x]);
x += bn;
x /= 2;
while (x) {
d[x] = (d[2 * x] * d[2 * x + 1]) % m;
x /= 2;
}
}
int main() {
for (int i = 2; i <= 200000; i += 2) pl[i] = 1;
pr[++pn] = 2;
for (int i = 3; i <= 200000; i += 2) {
if (!pl[i]) {
pr[++pn] = i;
for (int j = i; j <= 200000; j += i) pl[j] = pn;
}
}
bn = 1;
while (bn < pn) bn *= 2;
bn--;
for (int i = 1; i < 2 * (bn + 1); i++) d[i] = 1;
scanf("%d%d", &n, &m);
n -= 2;
long long res = 1, s;
for (int i = 2; i <= n; i++) {
upd(1, 1);
k = 2 * i - 1;
while (k > 1) {
v = pr[pl[k]];
upd(pl[k], 1);
k /= v;
}
k = i + 1;
while (k > 1) {
v = pr[pl[k]];
upd(pl[k], -1);
k /= v;
}
res += d[1];
if (res >= m) res %= m;
}
printf("%lld", res);
}
I2luY2x1ZGUgPGNzdGRpbz4KaW50IG4sIG0sIGssIHY7CmludCBwclsyMDAwMDVdLCBwbiwgcGxbMjAwMDA1XSwgYm4sIGNudFszMDAwNV07CmxvbmcgbG9uZyBkWzMwMDA1ICogM107IC8vYmluYXJ5IGluZGV4ZWQgdHJlZQpsb25nIGxvbmcgWCwgWTsKbG9uZyBsb25nIG11bChpbnQgYSwgaW50IGIpIHsKCVggPSAxOyBZID0gYTsKCXdoaWxlIChiKSB7CgkJaWYgKGIgJiAxKSBYID0gKFgqWSkgJSBtOwoJCVkgKj0gWTsgYiAvPSAyOwoJfQoJcmV0dXJuIFg7Cn0Kdm9pZCB1cGQoaW50IHgsIGludCB5KSB7CgljbnRbeF0gKz0geTsKCWRbYm4gKyB4XSA9IG11bChwclt4XSwgY250W3hdKTsKCXggKz0gYm47Cgl4IC89IDI7Cgl3aGlsZSAoeCkgewoJCWRbeF0gPSAoZFsyICogeF0gKiBkWzIgKiB4ICsgMV0pICUgbTsKCQl4IC89IDI7Cgl9Cn0KaW50IG1haW4oKSB7Cglmb3IgKGludCBpID0gMjsgaSA8PSAyMDAwMDA7IGkgKz0gMikgcGxbaV0gPSAxOwoJcHJbKytwbl0gPSAyOwoJZm9yIChpbnQgaSA9IDM7IGkgPD0gMjAwMDAwOyBpICs9IDIpIHsKCQlpZiAoIXBsW2ldKSB7CgkJCXByWysrcG5dID0gaTsKCQkJZm9yIChpbnQgaiA9IGk7IGogPD0gMjAwMDAwOyBqICs9IGkpIHBsW2pdID0gcG47CgkJfQoJfQoJYm4gPSAxOwoJd2hpbGUgKGJuIDwgcG4pIGJuICo9IDI7Cglibi0tOwoJZm9yIChpbnQgaSA9IDE7IGkgPCAyICogKGJuICsgMSk7IGkrKykgZFtpXSA9IDE7CglzY2FuZigiJWQlZCIsICZuLCAmbSk7CgluIC09IDI7Cglsb25nIGxvbmcgcmVzID0gMSwgczsKCWZvciAoaW50IGkgPSAyOyBpIDw9IG47IGkrKykgewoJCXVwZCgxLCAxKTsKCQlrID0gMiAqIGkgLSAxOwoJCXdoaWxlIChrID4gMSkgewoJCQl2ID0gcHJbcGxba11dOwoJCQl1cGQocGxba10sIDEpOwoJCQlrIC89IHY7CgkJfQoJCWsgPSBpICsgMTsKCQl3aGlsZSAoayA+IDEpIHsKCQkJdiA9IHByW3BsW2tdXTsKCQkJdXBkKHBsW2tdLCAtMSk7CgkJCWsgLz0gdjsKCQl9CgkJcmVzICs9IGRbMV07CgkJaWYgKHJlcyA+PSBtKSByZXMgJT0gbTsKCX0KCXByaW50ZigiJWxsZCIsIHJlcyk7Cn0=