#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;
}