#include <bits/stdc++.h>
using namespace std;

using ll=long long;
#define int ll

#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define rep(i,b) rng(i,0,b)
#define gnr(i,a,b) for(int i=int(b)-1;i>=a;i--)
#define per(i,b) gnr(i,0,b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif

template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}

template<class t> using vc=vector<t>;
template<class t> using vvc=vc<vc<t>>;

using pi=pair<int,int>;
using vi=vc<int>;

template<class t,class u>
ostream& operator<<(ostream& os,const pair<t,u>& p){
	return os<<"{"<<p.a<<","<<p.b<<"}";
}

template<class t> ostream& operator<<(ostream& os,const vc<t>& v){
	os<<"{";
	for(auto e:v)os<<e<<",";
	return os<<"}";
}

using uint=unsigned;
using ull=unsigned long long;

//const uint mod=998244353;
//const uint mod=1000000007;
uint mod=1;
struct mint{
	uint v;
	mint(ll vv=0){s(vv%mod+mod);}
	mint& s(uint vv){
		v=vv<mod?vv:vv-mod;
		return *this;
	}
	mint operator-()const{return mint()-*this;}
	mint& operator+=(const mint&rhs){return s(v+rhs.v);}
	mint&operator-=(const mint&rhs){return s(v+mod-rhs.v);}
	mint&operator*=(const mint&rhs){
		v=ull(v)*rhs.v%mod;
		return *this;
	}
	mint&operator/=(const mint&rhs){return *this*=rhs.inv();}
	mint operator+(const mint&rhs)const{return mint(*this)+=rhs;}
	mint operator-(const mint&rhs)const{return mint(*this)-=rhs;}
	mint operator*(const mint&rhs)const{return mint(*this)*=rhs;}
	mint operator/(const mint&rhs)const{return mint(*this)/=rhs;}
	mint pow(int n)const{
		mint res(1),x(*this);
		while(n){
			if(n&1)res*=x;
			x*=x;
			n>>=1;
		}
		return res;
	}
	mint inv()const{return pow(mod-2);}
	/*mint inv()const{
		int x,y;
		int g=extgcd(v,mod,x,y);
		assert(g==1);
		if(x<0)x+=mod;
		return mint(x);
	}*/
	friend ostream& operator<<(ostream&os,const mint&m){
		return os<<m.v;
	}
	bool operator<(const mint&r)const{return v<r.v;}
	bool operator==(const mint&r)const{return v==r.v;}
};

const int vcmax=(1<<21)+10;
mint fact[vcmax],finv[vcmax],invs[vcmax];
void initfact(){
	fact[0]=1;
	rng(i,1,vcmax){
		fact[i]=fact[i-1]*i;
	}
	finv[vcmax-1]=fact[vcmax-1].inv();
	for(int i=vcmax-2;i>=0;i--){
		finv[i]=finv[i+1]*(i+1);
	}
	for(int i=vcmax-1;i>=1;i--){
		invs[i]=finv[i]*fact[i-1];
	}
}
mint choose(int n,int k){
	return fact[n]*finv[n-k]*finv[k];
}
mint binom(int a,int b){
	return fact[a+b]*finv[a]*finv[b];
}
mint catalan(int n){
	return binom(n,n)-(n-1>=0?binom(n-1,n+1):0);
}

signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cout<<fixed<<setprecision(20);
	
	int n;cin>>n;
	cin>>mod;
	
	auto f=[&](int r,int y){
		int x=0;
		while(x*x+y*y<r*r)x++;
		return x;
	};
	auto g=[&](int r,int y){
		int x=0;
		while(x*x+y*y<=r*r)x++;
		return x;
	};
	
	vc<pi> ab;
	rep(i,n)ab.eb(f(n,i),-i);
	rng(i,n,n*2)ab.eb(g(n*2,i),1);
	vi c(n);
	rep(i,n)c[i]=min(n*2,g(n*2,i));
	sort(all(ab));
	dmp(ab);
	dmp(c);
	
	mint ans=0;
	rep(k,n+1){
		vc<mint> dp(n+1);
		dp[0]=1;
		int as=0,bs=0;
		for(auto x:ab){
			if(x.b==1){
				rep(i,bs+1)
					dp[i]*=mint(x.a-as-i);
				as++;
			}else{
				per(i,bs+1){
					dp[i+1]+=dp[i]*mint(x.a-as-i);
					dp[i]*=mint(c[-x.b]-(n+k+bs-i));
				}
				bs++;
			}
		}
		if(k%2)ans-=dp[k];
		else ans+=dp[k];
	}
	
	cout<<ans<<endl;
}


Measured memory_bytes: 24832