#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const ll N=3e5+5,mod=998244353;
ll n,V,a[N],c[N],ans[N],P[N],FP[N],pr[N];
ll power(ll x,ll y){
if(!y) return 1ll;
ll z=power(x,y>>1ll);
z=(z*z)%mod;
if(y&1ll) return (z*x)%mod;
return z;
}
void add(ll &x,ll y){x=(x+y)%mod;}
ll inv(ll x){return power(x,mod-2);}
bool vis[N];
struct node{ll cnt,sum,tag,tag2;}tree[N<<2];
#define lc k<<1
#define rc k<<1|1
#define ls lc,l,mid
#define rs rc,mid+1,r
void pushup(int k){
tree[k].cnt=tree[lc].cnt+tree[rc].cnt;
}
void pushdown(int k){
if(tree[k].tag){
add(tree[lc].tag,tree[k].tag);
add(tree[rc].tag,tree[k].tag);
if(!tree[lc].tag2)
add(tree[lc].sum,tree[k].tag);
if(!tree[rc].tag2)
add(tree[rc].sum,tree[k].tag);
tree[k].tag=0;
}
}
void change1(int k,int l,int r,int x,int y,ll d){
if(x<=l&&r<=y){
if(tree[k].tag2)
return ;
add(tree[k].sum,d);
add(tree[k].tag,d);
return ;
}
int mid=l+r>>1;
pushdown(k);
if(x<=mid) change1(ls,x,y,d);
if(mid<y) change1(rs,x,y,d);
pushup(k);
}
void pre(int k,int l,int r){
if(l==r){
tree[k].cnt=1;
return ;
}
int mid=l+r>>1;
pre(ls);pre(rs);
pushup(k);
}
void change2(int k,int l,int r,int x){
if(l==r){
tree[k].cnt=0;
tree[k].tag2=1;
return ;
}
int mid=l+r>>1;
pushdown(k);
if(x<=mid) change2(ls,x);
else change2(rs,x);
pushup(k);
}
ll query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y) return tree[k].cnt;
int mid=l+r>>1;
pushdown(k);
if(x<=mid&&mid<y) return query(ls,x,y)+query(rs,x,y);
if(x<=mid) return query(ls,x,y);
return query(rs,x,y);
}
void work(int k,int l,int r){
if(l==r){
ans[l]=(ans[l]+tree[k].sum)%mod;
return ;
}
int mid=l+r>>1;
pushdown(k);
work(ls),work(rs);
}
ll A(ll x,ll y){return P[x]*FP[x-y]%mod;}
signed main(){
scanf("%lld%lld",&V,&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
P[0]=FP[0]=1;
for(int i=1;i<=V;i++) P[i]=P[i-1]*i%mod;
for(int i=1;i<=V;i++) FP[i]=inv(P[i]);
pre(1,1,V);
for(ll i=1,x,y,v1,v2;i<=n;i++){
if(a[i]==1) continue;
x=query(1,1,V,1,a[i]-1);
y=V-(i-1);
if(x==0) continue;
pr[i-1]=x*A(y-1,n-i)%mod;
v1=(A(y-1,n-i)%mod+(x-1)*(n-i)%mod*A(y-2,n-i-1)%mod)%mod;
v2=x*(n-i)%mod*A(y-2,n-i-1)%mod;
change1(1,1,V,1,a[i]-1,v1);
change1(1,1,V,a[i],V,v2);
change2(1,1,V,a[i]);
}
work(1,1,V);
for(int i=n;i;i--) add(pr[i],pr[i+1]);
for(int i=1;i<=n;i++) add(ans[a[i]],pr[i]);
for(int i=1;i<=n;i++) add(ans[a[i]],1);
for(int i=1;i<=V;i++) printf("%lld\n",(ans[i]%mod+mod)%mod);
return 0;
}