#include <iostream>
#include <utility>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int max_n = 250;
#define int ll
ll dp[max_n*2+1][max_n+1], m;
int l[max_n], r[max_n<<1], n;
pii a[max_n<<1];
inline void dwlr(int *src, int n, double msc)
{
for (int i = 0; i < n; i++)
src[i] = int(sqrt(n * n - i * i) - msc);
}
int solve(int k)
{
memset(dp, 0, sizeof dp);
int lc = 0, rc = 0;
dp[0][0] = 1;
for (int i = 0; i < (n << 1); i++)
{
if (a[i].second >= n)
{
for (int j = 0; j <= lc; j++)
dp[i+1][j] = (dp[i+1][j] + dp[i][j] * (a[i].first - rc - j + 1)) % m;
rc++;
}
else
{
for (int j = 0; j <= lc && j <= k; j++)
dp[i+1][j] = (dp[i+1][j] + dp[i][j] * (r[a[i].second] - lc - k - n + j + 1)) % m;
for (int j = 0; j < k && j <= lc; j++)
dp[i+1][j+1] = (dp[i+1][j+1] + dp[i][j] * (a[i].first - rc - j + 1)) % m;
lc++;
}
}
return dp[n<<1][k];
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
dwlr(l, n, 1e-7), dwlr(r, n << 1, 0), r[0] = 2 * n - 1;
for (int i = 0; i < n; i++)
{
a[i].first = l[i], a[i].second = i;
a[i+n].first = r[i+n], a[i+n].second = i + n;
}
sort(a, a + (n << 1), [](pii& a, pii& b) { return (a.first != b.first)? (a.first < b.first):(a.second > b.second); });
int ans = 0;
for (int i = 0; i <= n; i++)
ans = (ans + solve(i) * ((i & 1)? -1:1)) % m;
cout << (ans + m) % m << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKY29uc3QgaW50IG1heF9uID0gMjUwOwoKI2RlZmluZSBpbnQgbGwKCmxsIGRwW21heF9uKjIrMV1bbWF4X24rMV0sIG07CmludCBsW21heF9uXSwgclttYXhfbjw8MV0sIG47CnBpaSBhW21heF9uPDwxXTsKCmlubGluZSB2b2lkIGR3bHIoaW50ICpzcmMsIGludCBuLCBkb3VibGUgbXNjKQp7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQlzcmNbaV0gPSBpbnQoc3FydChuICogbiAtIGkgKiBpKSAtIG1zYyk7Cn0KCmludCBzb2x2ZShpbnQgaykKewoJbWVtc2V0KGRwLCAwLCBzaXplb2YgZHApOwoJaW50IGxjID0gMCwgcmMgPSAwOwoJCglkcFswXVswXSA9IDE7Cglmb3IgKGludCBpID0gMDsgaSA8IChuIDw8IDEpOyBpKyspCgl7CgkJaWYgKGFbaV0uc2Vjb25kID49IG4pCgkJewoJCQlmb3IgKGludCBqID0gMDsgaiA8PSBsYzsgaisrKQoJCQkJZHBbaSsxXVtqXSA9IChkcFtpKzFdW2pdICsgZHBbaV1bal0gKiAoYVtpXS5maXJzdCAtIHJjIC0gaiArIDEpKSAlIG07CgkJCXJjKys7CgkJfQoJCWVsc2UKCQl7CgkJCWZvciAoaW50IGogPSAwOyBqIDw9IGxjICYmIGogPD0gazsgaisrKQoJCQkJZHBbaSsxXVtqXSA9IChkcFtpKzFdW2pdICsgZHBbaV1bal0gKiAoclthW2ldLnNlY29uZF0gLSBsYyAtIGsgLSBuICsgaiArIDEpKSAlIG07CgkJCWZvciAoaW50IGogPSAwOyBqIDwgayAmJiBqIDw9IGxjOyBqKyspCgkJCQlkcFtpKzFdW2orMV0gPSAoZHBbaSsxXVtqKzFdICsgZHBbaV1bal0gKiAoYVtpXS5maXJzdCAtIHJjIC0gaiArIDEpKSAlIG07CgkJCWxjKys7CgkJfQoJfQoJCglyZXR1cm4gZHBbbjw8MV1ba107Cn0KCnNpZ25lZCBtYWluKCkKewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKDApOwoJCgljaW4gPj4gbiA+PiBtOwoJZHdscihsLCBuLCAxZS03KSwgZHdscihyLCBuIDw8IDEsIDApLCByWzBdID0gMiAqIG4gLSAxOwoJCglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCXsKCQlhW2ldLmZpcnN0ID0gbFtpXSwgYVtpXS5zZWNvbmQgPSBpOwoJCWFbaStuXS5maXJzdCA9IHJbaStuXSwgYVtpK25dLnNlY29uZCA9IGkgKyBuOwoJfQoJc29ydChhLCBhICsgKG4gPDwgMSksIFtdKHBpaSYgYSwgcGlpJiBiKSB7IHJldHVybiAoYS5maXJzdCAhPSBiLmZpcnN0KT8gKGEuZmlyc3QgPCBiLmZpcnN0KTooYS5zZWNvbmQgPiBiLnNlY29uZCk7IH0pOwoJCglpbnQgYW5zID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykKCQlhbnMgPSAoYW5zICsgc29sdmUoaSkgKiAoKGkgJiAxKT8gLTE6MSkpICUgbTsKCWNvdXQgPDwgKGFucyArIG0pICUgbSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==