#include <bits/stdc++.h>
using namespace std;
struct vec {
  long double x, y;
  bool operator==(const vec &a) const { return x == a.x && y == a.y; }
  bool operator<(const vec &a) const {
    if (a.x != x) return x < a.x;
    return y < a.y;
  }
  vec operator+(const vec &a) const { return {x + a.x, y + a.y}; }
  vec operator*(const long double &a) const { return {x * a, y * a}; }
  vec operator-(const vec &a) const { return {x - a.x, y - a.y}; }
  vec operator/(const long double &a) const { return {x / a, y / a}; }
  long double len() const { return (x * x + y * y); }
  long double dot(const vec &a) const { return x * a.x + y * a.y; }
  long double crs(const vec &a) const { return x * a.y - y * a.x; }
  vec proj(const vec &a) const {
    return (a / a.len()) * (*this).dot(a) / a.len();
  }
};
struct P {
  int x, y, z;
  bool operator<(const P &a) const { return x > a.x; }
};
bool as(P a, P b) {
  if (a.x != b.x) return a.x > b.x;
  return a.y < b.y;
}
long long x, y, z, mod = 998244353;
vector<int> v, v1[1];
int i, n, m, k, a, d, b, c, h, dx[10] = {1, 0, -1, 0}, dy[10] = {0, 1, 0, -1};
int e;
long long l[2221][4444];
int o[2221];
int j[1];
stack<int> s;
queue<P> q, q1;
P u[1], u1[2];
char r[1];
map<int, int> p;
long long f(int n, int m) {
  if (n > a) {
    if (m > 2000) return 1;
    return 0;
  }
  if (l[n][m] >= 0) return l[n][m];
  if (o[n] == o[n % a + 1]) {
    return l[n][m] = (f(n + 1, m) * b) % mod;
  } else {
    return l[n][m] = (f(n + 1, m - 1) + f(n + 1, m + 1) +
                      f(n + 1, m) * (b - 2) % mod) %
                     mod;
  }
}
int main() {
  memset(l, -1, sizeof(l));
  scanf("%d %d", &a, &b);
  for (int t = 1; t <= a; t++) {
    scanf("%d", &o[t]);
    v.push_back(o[t]);
  }
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
  for (int h = 0; h < v.size(); h++) p[v[h]] = h + 1;
  for (int t = 1; t <= a; t++) o[t] = p[o[t]];
  printf("%lld", f(1, 2000));
}
