#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
const int MAXN=3010,mod=998244353;
int n,c,a[MAXN];
void inc(int &x,int y){x=(x+y)%mod;}
int read()
{
	int x=0;
	char ch=0;
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x;
}
int fastpow(int a,int k)
{
	re int c=1;
	for(;k;k>>=1,a=1ll*a*a%mod) if(k&1) c=1ll*c*a%mod;
	return c;
}
namespace solve1
{
	int b[MAXN],cnt[MAXN],f[MAXN][MAXN],g[MAXN][MAXN],h[MAXN],pw[MAXN],pow[MAXN],invpw[MAXN],incpw[MAXN];
	void main()
	{	
		pow[0]=1;
		for(re int i=1;i<=n;i++) pow[i]=2ll*pow[i-1]%mod,pw[i]=(pow[i]-1+mod)%mod,invpw[i]=fastpow(pw[i],mod-2);
		for(re int i=2;i<=n;i++) incpw[i]=1ll*pw[i]*invpw[i-1]%mod;
		//for(re int i=2;i<=n;i++) printf("%d %d %d\n",pow[i],pw[i],incpw[i]);
		for(re int i=1;i<=n;i++)
		{
			for(re int j=1;j<=c;j++) cnt[j]=0;
			re int tot=0,res=1;
			for(re int j=i;j<=n;j++)
			{
				if(b[a[j]]!=i)
				{
					tot++;
					b[a[j]]=i;
					cnt[a[j]]=1;
				}
				else
				{
					res=1ll*res*incpw[cnt[a[j]]+1]%mod;
					cnt[a[j]]++;
				}
				if(tot==c) g[j][i]=1ll*res*invpw[cnt[a[j]]]%mod;
			}
			re int cur=1;
			for(re int j=1;j<=c;j++) cur=1ll*cur*pw[cnt[j]]%mod;
			h[i]=((pow[n-i+1]-cur)%mod+mod)%mod;
		}
		h[1]=(h[1]-1+mod)%mod;
		f[0][0]=1;
		for(re int j=1;j<=n;j++)
			for(re int i=1;i<=n;i++)
				for(re int k=0;k<=i-c;k++)
					inc(f[j][i],1ll*f[j-1][k]*g[i][k+1]%mod);
		for(re int j=0;j<=n/c;j++)
			for(re int i=0;i<n;i++) inc(f[j][n],1ll*f[j][i]*h[i+1]%mod);
		for(re int i=0;i<=n;i++) printf("%d ",f[i][n]);
		printf("\n");
	}
}
namespace solve2
{
	int f[2][MAXN][1030],ans[MAXN];
	void main()
	{
		re int now=1,up=(1<<c)-1;
		f[0][0][0]=1;
		for(re int i=0;i<n;i++)
		{
			now^=1;
			re int nxt=now^1;
			re int cur=1<<a[i+1]-1;
			for(re int j=0;j<=i/c+1;j++) for(re int k=0;k<up;k++) f[nxt][j][k]=0;
			for(re int j=0;j<=i/c;j++)
			{
				for(re int k=0;k<up;k++)
				{
					re int msk=k|cur;
					if(msk==up) inc(f[nxt][j+1][0],f[now][j][k]);
					else inc(f[nxt][j][msk],f[now][j][k]);
					inc(f[nxt][j][k],f[now][j][k]);
				}
			}
		}
		now^=1;
		for(re int j=0;j<=n;j++)
			for(re int k=0;k<up;k++)
				inc(ans[j],f[now][j][k]);
		inc(ans[0],mod-1);
		for(re int j=0;j<=n;j++) printf("%d ",ans[j]);
		printf("\n");
		/*re int res=1;
		for(re int j=0;j<=n;j++) inc(res,ans[j]);
		printf("%d\n",res);*/
	}
}
int main()
{
	n=read();
	c=read();
	for(re int i=1;i<=n;i++) a[i]=read();
	if(c>11) solve1::main();
	else solve2::main();
}
/*
15 3
1 3 2 1 1 2 3 3 2 1 1 3 2 3 3
*/