#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("-ffloat-store")
using namespace std;
clock_t time_p = clock();
void aryanc403() {}
const long long int INF = 0xFFFFFFFFFFFFFFFL;
long long int seed;
mt19937 rng(seed = chrono::steady_clock::now().time_since_epoch().count());
inline long long int rnd(long long int l = 0, long long int r = INF) {
  return uniform_int_distribution<long long int>(l, r)(rng);
}
class CMP {
 public:
  bool operator()(pair<long long int, long long int> a,
                  pair<long long int, long long int> b) {
    return !(a.first < b.first || (a.first == b.first && a.second <= b.second));
  }
};
void add(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt == m.end())
    m.insert({x, cnt});
  else
    jt->second += cnt;
}
void del(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt->second <= cnt)
    m.erase(jt);
  else
    jt->second -= cnt;
}
bool cmp(const pair<long long int, long long int> &a,
         const pair<long long int, long long int> &b) {
  return a.first < b.first || (a.first == b.first && a.second < b.second);
}
const long long int mod = 998244353LL;
long long int T, n, i, j, k, in, cnt, l, r, u, v, x, y;
long long int m;
string s;
vector<long long int> a;
const int N = 2e5 + 5;
long long int fac[N + 5], inv[N + 5];
long long int po(long long int a, long long int n) {
  if (n < 0) {
    a = po(a, mod - 2);
    n *= -1;
  }
  if (n == 0) return 1;
  if (n % 2) return (a * po(a, n - 1)) % mod;
  return po(a * a % mod, n / 2);
}
long long int nCr(long long int n, long long int r) {
  if (n < 0 || r < 0 || r > n) return 0;
  long long int ans = 1;
  ans = (ans * fac[n]) % mod;
  ans = (ans * inv[r]) % mod;
  ans = (ans * inv[n - r]) % mod;
  return ans;
}
void pre(long long int n) {
  long long int i;
  fac[0] = 1;
  for (i = (1); i <= (n); ++i) fac[i] = (i * fac[i - 1]) % mod;
  inv[n] = po(fac[n], mod - 2);
  for (i = (n); i >= (1); --i) inv[i - 1] = (i * inv[i]) % mod;
  assert(inv[0] == 1);
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  {
    cin >> n >> k;
    a.clear();
    a.reserve(n + 2);
    a.push_back(0);
    for (i = 0; i < (n); ++i) {
      cin >> in;
      a.push_back(in);
    }
    a.push_back(a[1]);
    a[0] = a[n];
    for (i = (1); i <= (n); ++i) cnt += (a[i] != a[i - 1]);
    pre(cnt);
    long long int ans = 0;
    for (i = (0); i <= (cnt); ++i) {
      long long int v = 1;
      v = (v * nCr(cnt, i)) % mod;
      v = (v * nCr(cnt - i, i)) % mod;
      v = (v * po(k - 2, cnt - 2 * i)) % mod;
      ans -= v;
      ;
    }
    ans %= mod;
    ans *= po(k, n - cnt);
    ans %= mod;
    ans += po(k, n);
    ans %= mod;
    ans *= (mod + 1) / 2;
    ans %= mod;
    ans += mod;
    ans %= mod;
    cout << ans << "\n";
  }
  aryanc403();
  return 0;
}
