#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vl = vector<long long>;
using pii = pair<int, int>;
using vpii = vector<pair<int, int>>;
template <class T>
inline bool ckmin(T &a, T b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
inline bool ckmax(T &a, T b) {
  return b > a ? a = b, 1 : 0;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const char nl = '\n';
const int mxN = 102;
const int MOD = 1e9 + 7;
const long long infLL = 1e18;
int fact[mxN];
int add(int x, int y) {
  x += y;
  while (x >= MOD) x -= MOD;
  while (x < 0) x += MOD;
  return x;
}
void ad(int &x, int y) { x = add(x, y); }
int sub(int x, int y) {
  x -= y;
  while (x >= MOD) x -= MOD;
  while (x < 0) x += MOD;
  return x;
}
void sb(int &x, int y) { x = sub(x, y); }
int mul(int x, int y) { return ((int64_t)x * (int64_t)y) % MOD; }
void ml(int &x, int y) { x = mul(x, y); }
int binpow(int x, int y) {
  int z = 1;
  while (y > 0) {
    if (y % 2 == 1) z = mul(z, x);
    x = mul(x, x);
    y /= 2;
  }
  return z;
}
int inv(int x) { return binpow(x, MOD - 2); }
int divide(int x, int y) { return mul(x, inv(y)); }
void precalc() {
  fact[0] = 1;
  for (int i = 1; i < mxN; i++) fact[i] = mul(i, fact[i - 1]);
}
int choose(int n, int k) {
  if (k > n) return 0;
  return divide(fact[n], mul(fact[n - k], fact[k]));
}
template <class T, int N>
struct Mat {
  array<array<T, N>, N> d{};
  Mat operator*(const Mat &m) const {
    Mat a;
    for (int i = (0); i < (N); i++)
      for (int j = (0); j < (N); j++)
        for (int k = (0); k < (N); k++) {
          ad(a.d[i][j], mul(d[i][k], m.d[k][j]));
        }
    return a;
  };
  vector<T> operator*(const vector<T> &vec) {
    vector<T> ret(N);
    for (int i = (0); i < (N); i++)
      for (int j = (0); j < (N); j++) ret[i] += d[i][j] * vec[j];
    return ret;
  };
  Mat operator^(ll p) {
    Mat a, b(*this);
    for (int i = (0); i < (N); i++) a.d[i][i] = 1;
    while (p) {
      if (p & 1) a = a * b;
      b = b * b;
      p /= 2;
    }
    return a;
  };
};
int n, k;
int a[mxN];
int cnt[2];
Mat<int, mxN> M;
int cnt0;
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k;
  for (int i = (0); i < (n); i++) {
    cin >> a[i];
    cnt[a[i]]++;
  }
  for (int i = (0); i < (cnt[0]); i++) {
    if (a[i] == 0) cnt0++;
  }
  for (int i = (0); i < (cnt[0] + 1); i++) {
    for (int j = (0); j < (cnt[0] + 1); j++) {
      int c0 = i;
      int d0 = cnt[0] - c0;
      int c1 = cnt[0] - i;
      int d1 = cnt[1] - c1;
      if (min({c0, d0, c1, d1}) < 0) continue;
      if (i == j) {
        M.d[i][j] = c0 * d0 + c1 * d1 + cnt[0] * (cnt[0] - 1) / 2 +
                    (n - cnt[0]) * (n - cnt[0] - 1) / 2;
      } else if (i + 1 == j) {
        M.d[i][j] = c1 * d0;
      } else if (i - 1 == j) {
        M.d[i][j] = c0 * d1;
      }
    }
  }
  Mat<int, mxN> res = M ^ k;
  int tot = 0;
  for (int i = (0); i < (n + 1); i++) {
    ad(tot, res.d[cnt0][i]);
  }
  cout << divide(res.d[cnt0][cnt[0]], tot) << nl;
  return 0;
}
