#include<bits/stdc++.h>
template<typename _Tp>void read(_Tp &x){
	char ch=getchar();bool f=0;while(!isdigit(ch))f|=ch=='-',ch=getchar();
	x=ch&15,ch=getchar();while(isdigit(ch))x=x*10+(ch&15),ch=getchar();
	if(f)x=-x;
}
template<typename _Tp,typename ...Args>void read(_Tp &x,Args &...args){read(x),read(args...);}
const int N=505;int mod;typedef long long ll;
template<typename _Tp1,typename _Tp2>inline void add(_Tp1 &a,_Tp2 b){a=a+b>=mod?a+b-mod:a+b;}
template<typename _Tp1,typename _Tp2>inline void sub(_Tp1 &a,_Tp2 b){a=a<b?a+mod-b:a-b;}
int dp[N][N][N];
int main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	int n;read(n,mod);
	for(int i=0;i<=n;++i)dp[1][0][i]=i%mod;
	for(int i=2;i<=n;++i){
		for(int j=0;j<=i-1;++j){
			for(int k=0;k<=n-i+1;++k)if(dp[i-1][j][k]){
				int tmp=1LL*(i-1-j)*k%mod;
				add(dp[i][j][k],1LL*dp[i-1][j][k]*tmp%mod);
				sub(dp[i][j+1][k],2LL*dp[i-1][j][k]*tmp%mod);
				if(k)add(dp[i][j+1][k-1],1LL*dp[i-1][j][k]*(i-1-j)%mod*(k-1)%mod);
			}
		}
	}
	for(int i=2;i<=n;++i){
		int ans=0;for(int j=1;j<=i;++j)add(ans,1LL*dp[i-1][j-1][1]*(i-j)%mod);
		printf("%d\n",ans);
	}
	return 0;
}
