#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;

#define LL long long
#define DB double
#define MAXN 100
#define Pr pair<int,int>
#define X first
#define Y second
#define INF 1000000001
#define mem(x,v) memset(x,v,sizeof(x))

LL read(){
    LL x=0,F=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')F=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*F;
}

int MOD;
inline int add(int a,int b){return (a+b>=MOD)?a+b-MOD:a+b;}
inline int dec(int a,int b){return (a-b<0)?a-b+MOD:a-b;}
int mul(int a,int b){return (1LL*a*b)%MOD;}
int fst_pow(int a,int b){
	int res=1;
	while(b){
		if(b&1)res=mul(res,a);
		a=mul(a,a),b>>=1;
	}return res;
}
inline void upd(int &a,int b){a=add(a,b);}

int n,k,lim,res,dp[MAXN+5][MAXN*MAXN*MAXN+5];

int main(){
	n=read(),k=read(),MOD=read();
	lim=k*n*(n-1)/2;
	dp[0][0]=1;
	for(int i=1;i<n;i++){
		for(int j=0;j<=lim;j++){
			upd(dp[i][j],dp[i-1][j]);
			if(j>=i)upd(dp[i][j],dp[i][j-i]);
		}
		for(int j=lim;j>=i*(k+1);j--)
		upd(dp[i][j],dec(0,dp[i][j-i*(k+1)]));
	}
	for(int i=1;i<=n;i++){
		res=0;
		for(int j=0;j<=lim;j++)
		res=add(res,mul(dp[i-1][j],dp[n-i][j]));
		printf("%d\n",dec(mul(res,k+1),1));
	}
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

#define mp make_pair
#define pb push_back
#define ll long long

//#define debug(x) ;
#define debug(x) cerr << #x << " = " << x << "\n";

ostream& operator<<(ostream& cerr, vector<ll> aux) {
  cerr << "[";
  for (auto e : aux) cerr << e << ' ';
  cerr << "]";
  return cerr;
}

const int maxSum = 1000011;

ll n, k, mod;
ll pos[maxSum], neg[maxSum], aux[maxSum];
ll ans[111];

void addGroup(ll *data, ll val) {
  ll limit = k * val * val + 1;
  memcpy(aux, data, limit * sizeof(ll));

  for (int i = 0; i < limit; i++) {
    if (i - val >= 0) 
      data[i] += data[i - val];
    
    if (i - val * (k + 1) >= 0)
      data[i] += mod - aux[i - val * (k + 1)];

    data[i] %= mod;
  }
}

void removeGroup(ll *data, ll val) {
  ll limit = k * val * val + 1;
  memcpy(aux, data, limit * sizeof(ll));

  for (int i = 0; i < limit; i++) {
    if (i - val >= 0)
      data[i] += mod - aux[i - val];

    if (i - val * (k + 1) >= 0)
      data[i] += data[i - val * (k + 1)];

    data[i] %= mod;
  }
}

int main()
{
  //freopen("test.in", "r", stdin);

  cin >> n >> k >> mod;

  // build full positive up to + (n - 1)
  pos[0] = k + 1;
  for (int i = 1; i < n; i++)
    addGroup(pos, i);

  // build empty negative 
  neg[0] = 1;

  for (int i = 1; i <= n; i++) {
    if (n - i + 1 < i) {
      cout << ans[n - i + 1] << '\n';
      continue;
    }

    ll answer = 0;
    ll limit = k * (i * i + (n - i) * (n - i)) + 1; 

    for (int j = 0; j < limit; j++)
      answer += pos[j] * neg[j] % mod;

    ans[i] = (mod + answer - 1) % mod;
    cout << ans[i] << '\n'; 

    removeGroup(pos, n - i);
    addGroup(neg, i);
  }

  return 0;
}
