#include <cstring>
#include <iostream>
#include <algorithm>
#define endl '\n'
#define int long long
#define inf 0x3f3f3f3f
#define lnf 0x3f3f3f3f3f3f3f3f
const bool Debug = false;
#define Debug true
using namespace std;
const int N = 500;
void init ();
int n, p;
int f[N + 5][N + 5][3] = {}, _Ans = 0;
int _Prm[9] = {0, 2, 3, 5, 7, 11, 13, 17, 19};
class Node {
private :
protected :
public :
int _Vl, _Pr, _S;
bool operator < (const Node _Oper) {
return _Pr < _Oper._Pr;
}
void Do () {
int _ = _Vl;
_Pr = -1;
_S = 0;
for (register int i = 1; i <= 8; ++ i) {
if (_ % _Prm[i]) {
continue ;
}
_S |= (1 << (i - 1));
while (! (_ % _Prm[i])) {
_ /= _Prm[i];
}
}
if (_ - 1) {
_Pr = _;
}
}
} a[N + 5];
signed main () {
init ();
cin >> n >> p;
for (register int i = 2; i <= n; ++ i) {
a[i - 1]._Vl = i;
a[i - 1].Do ();
}
sort (a + 1, a + n);
f[0][0][0] = 1;
for (register int i = 1; n - i; ++ i) {
if (! (i - 1) || (a[i]._Pr - a[i - 1]._Pr) || ! (a[i]._Pr + 1)) {
for (register int i = 0; i < N; ++ i) {
for (register int j = 0; j < N; ++ j) {
f[i][j][1] = f[i][j][2] = f[i][j][0];
}
}
}
for (register int j = 255; j + 1; -- j) {
for (register int k = 255; k + 1; -- k) {
if (j & k) {
continue ;
}
if (! (a[i]._S & j)) {
f[j][k | a[i]._S][2] = (f[j][k | a[i]._S][2] + f[j][k][2]) % p;
}
if (! (a[i]._S & k)) {
f[j | a[i]._S][k][1] = (f[j | a[i]._S][k][1] + f[j][k][1]) % p;
}
}
}
if (! (n - i - 1) || (a[i]._Pr - a[i - 1]._Pr) || ! (a[i]._Pr + 1)) {
for (register int j = 0; 256 - j; ++ j) {
for (register int k = 0; 256 - k; ++ k) {
if (j & k) {
continue ;
}
f[j][k][0] = (f[j][k][1] + f[j][k][2] - f[j][k][0] + p) % p;
if (Debug) {
cout << f[j][k][0] << endl;
}
}
}
}
}
for (register int i = 0; 256 - i; ++ i) {
for (register int j = 0; 256 - j; ++ j) {
if (i & j) {
continue ;
}
_Ans = (_Ans + f[i][j][0]) % p;
if (Debug) {
cout << _Ans << endl;
}
}
}
cout << _Ans << endl;
return 0;
}
void init () {
ios :: sync_with_stdio (false);
cin.tie (0);
cout.tie (0);
}