#include <bits/stdc++.h>
using namespace std;
const int maxn = 41;
long long a[maxn];
int mzk[1 << 21];
bool dp[1 << 21][2];
int mx[1 << 21];
inline bool popsort(int x, int y) {
  return __builtin_popcount(x) < __builtin_popcount(y);
}
void clq(int l, int r, int k) {
  int z = r - l;
  for (int msk = 0; msk < (1 << z); msk++) {
    long long cm = -1 + (1ll << 40);
    for (int j = 0; j < z; j++) {
      if ((msk & (1 << j)) != 0) cm = cm & (a[j + l] | (1ll << (j + l)));
    }
    dp[msk][k] = true;
    for (int j = 0; j < z; j++) {
      if (((msk & (1 << j)) != 0) && ((cm & (1ll << (j + l))) == 0)) {
        dp[msk][k] = false;
        break;
      }
    }
  }
}
int main() {
  int n;
  cin >> n;
  double k;
  cin >> k;
  for (int i = 0; i < n; i++) {
    a[i] = 0;
    for (int j = 0; j < n; j++) {
      int x;
      cin >> x;
      if (x == 1) {
        a[i] = a[i] | (1ll << j);
      }
    }
  }
  int m = n / 2 + 1;
  for (int i = 0; i < (1 << m); i++) mzk[i] = i;
  sort(mzk, mzk + (1 << m), popsort);
  clq(0, m, 0);
  clq(m, n, 1);
  for (int idx = 0; idx < (1 << m); idx++) {
    int msk = mzk[idx];
    mx[msk] = 0;
    if (dp[msk][0]) {
      mx[msk] = __builtin_popcount(msk);
      continue;
    }
    for (int j = 0; j < m; j++) {
      if ((msk & (1 << j)) != 0) {
        mx[msk] = max(mx[msk], mx[msk ^ (1 << j)]);
      }
    }
  }
  int ans = 0;
  for (int idx = 0; idx < (1 << m); idx++) {
    int msk = mzk[idx];
    if (msk >= (1 << (n - m))) continue;
    if (!dp[msk][1]) continue;
    long long cm = (1ll << 40) - 1;
    for (int j = 0; j < n - m; j++) {
      if ((msk & (1 << j)) != 0) {
        cm = cm & a[j + m];
      }
    }
    cm = cm & ((1 << m) - 1);
    ans = max(ans, mx[cm] + __builtin_popcount(msk));
  }
  cout << setprecision(12) << fixed << (k * k * (ans - 1) / (2 * ans)) << endl;
}
