#include <bits/stdc++.h>
bool path[110][110];
int n, mmax;
int dp[110];
bool v[110];
int seq[110], seq_pos;
bool dfs(int pos, int size) {
  int i, j, unvis;
  bool tv[110];
  unvis = 0;
  for (i = pos; i < n; i++) {
    if (!v[i]) {
      unvis++;
    }
  }
  if (unvis == 0) {
    if (size > mmax) {
      mmax = size;
      seq_pos = 0;
      seq[seq_pos++] = pos + 1;
      return true;
    }
    return false;
  }
  for (i = pos; i < n && unvis > 0; i++) {
    if (!v[i]) {
      if (unvis + size <= mmax || dp[i] + size <= mmax) {
        return false;
      }
      v[i] = true;
      unvis--;
      memcpy(tv, v, sizeof(v));
      for (j = 0; j < n; j++) {
        if (!path[i][j]) {
          v[j] = true;
        }
      }
      if (dfs(i, size + 1)) {
        seq[seq_pos++] = pos + 1;
        return true;
      }
      memcpy(v, tv, sizeof(v));
    }
  }
  return false;
}
int max_clique() {
  int i, j;
  mmax = 0;
  for (i = 0; i < n; i++) {
    path[i][i] = false;
  }
  for (i = n - 1; i >= 0; i--) {
    for (j = 0; j < n; j++) {
      v[j] = !path[i][j];
    }
    dfs(i, 1);
    dp[i] = mmax;
  }
  return mmax;
}
int main() {
  double val;
  scanf("%d%lf", &n, &val);
  memset(path, 0, sizeof(path));
  for (int x = 0; x < n; x++)
    for (int y = 0; y < n; y++) {
      int yy;
      scanf("%d", &yy);
      if (yy == 1) path[x][y] = true;
    }
  memset(dp, 0, sizeof(dp));
  int xx = max_clique();
  if (xx == 0) {
    printf("0\n");
    return 0;
  }
  double ans = val * val * (xx - 1.0) / (2.0 * xx);
  printf("%.10lf\n", ans);
}
