#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair < int , int > pii;
#define mpr make_pair
#define FS first
#define SC second
#define PB push_back
template < typename T > void UMAX(T &a,T b){a=(a>b?a:b);}
template < typename T > void UMIN(T &a,T b){a=(a<b?a:b);}
LL readint(){
	char c=getchar();
	LL ret=0ll;
	bool neg=0;
	while(!(c>='0' && c<='9')){
		if(c=='-') neg=1;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		ret=ret*10ll+(LL)(c-'0');
		c=getchar();
	}
	return neg?-ret:ret;
}
void putint(LL v){
	if(v<0){
		putchar('-');
		v=-v;
	}
	if(!v){
		putchar('0');
		return;
	}
	if(v>=10ll) putint(v/10ll);
	putchar('0'+(v%10ll));
}
const int MOD=998244353;
int powM(int V,int T=MOD-2){
	int R=1;
	while(T){
		if(T&1) R=(LL)R*V%MOD;
		T>>=1;
		V=(LL)V*V%MOD;
	}
	return R;
}
int n,m,p[200005],cv[200005];
struct BIT{
	int a[200005];
	void add(int p,int v){
		++p;
		while(p<=n){
			a[p]+=v;
			if(a[p]>=MOD) a[p]-=MOD;
			p+=p&-p;
		}
	}
	int sum(int p){
		++p;
		int r=0;
		while(p){
			r+=a[p];
			if(r>=MOD) r-=MOD;
			p-=p&-p;
		}
		return r;
	}
}CNT,SUM;
int main(){
	int i,j,k;
	n=readint();m=readint();
	for(i=0;i<n;++i) p[i]=n-readint();
	for(i=0;i<m;++i) cv[i]=0;
	for(i=m;i<n;++i) cv[i]=i-m+1;
	int c=0,p1=0,p2=0,ss=0,invm=(1+MOD-powM(m))%MOD,om=powM(invm),ci=1,cp=1;
	for(i=0;i<n;++i){
		if(i && cv[i]>cv[i-1]) ci=(LL)ci*invm%MOD,cp=(LL)cp*om%MOD;
		c+=CNT.sum(p[i]);
		if(c>=MOD) c-=MOD;
		CNT.add(p[i],1);
		p1+=(LL)SUM.sum(p[i])*ci%MOD;
		if(p1>=MOD) p1-=MOD;
		SUM.add(p[i],cp);
		p2+=(LL)ss*ci%MOD;
		if(p2>=MOD) p2-=MOD;
		ss+=cp;
		if(ss>=MOD) ss-=MOD;
	}
//	printf("p2=%d p1=%d c=%d\n",p2,p1,c);
	int inv2=(MOD+1)/2;
	int res=((LL)inv2*p2+c-p1+MOD)%MOD;
	printf("%d\n",res);
	return 0;
}
/*
 * 代码框架
 * 1. 开数组记录每个位置的最小覆盖标号 
 * 2. 预处理K的逆
 * 3. 开两个BIT分别维护个数和总和，得到逆序对的总个数c和总概率p1。
 * 4. 计算全局总概率p2，答案等于p2/2+c-p1
*/