#include <bits/stdc++.h>
using namespace std;
const int N = 45;
const int M = 20;
vector<int> adj[N], lis;
int n, f[(1 << M)], mask[N], mask2[N], val1[(1 << M)];
void back(int pos, int lim, int mask1) {
  if (pos == lim + 1) {
    int now = (1 << (n - lim)) - 1;
    for (int i = 1; i <= lim; i++) {
      if ((mask1 ^ (1 << (i - 1))) < mask1) {
        now = (now & mask2[i]);
      }
    }
    val1[now] = max(val1[now], __builtin_popcount(mask1));
    return;
  }
  if ((mask[pos] & mask1) == mask1) {
    back(pos + 1, lim, (mask1 ^ (1 << (pos - 1))));
  }
  back(pos + 1, lim, mask1);
}
void back1(int pos, int lim, int mask1) {
  if (pos == lim + 1) {
    f[mask1] = __builtin_popcount(mask1);
    return;
  }
  if ((mask[pos] & mask1) == mask1) {
    back1(pos + 1, lim, (mask1 ^ (1 << (pos - 1 - n / 2))));
  }
  back1(pos + 1, lim, mask1);
}
int main() {
  int i, j, k, l, ans = 1, val;
  cin >> n >> val;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      cin >> k;
      if (k == 1) {
        adj[i].push_back(j);
        if (i <= n / 2) {
          if (j <= n / 2) {
            mask[i] = (mask[i] ^ (1 << (j - 1)));
          } else {
            mask2[i] = (mask2[i] ^ (1 << (j - n / 2 - 1)));
          }
        } else {
          if (j > n / 2) {
            mask[i] = (mask[i] ^ (1 << (j - n / 2 - 1)));
          }
        }
      }
    }
  }
  back(1, n / 2, 0);
  back1(n / 2 + 1, n, 0);
  for (i = 0; i < (1 << (n - n / 2)); i++) {
    for (j = 0; j < n - n / 2; j++) {
      if ((i ^ (1 << j)) < i) {
        f[i] = max(f[i], f[(i ^ (1 << j))]);
      }
    }
    ans = max(ans, f[i] + val1[i]);
  }
  cout << fixed << setprecision(9)
       << (double)(val) * (double)(val) * (double)(ans - 1) / (double)(2 * ans);
}
