#include <bits/stdc++.h>
using namespace std;
int n, k, m;
int a[50][50];
int dp[2][1 << 22];
vector<int> cur;
vector<int> path;
int main() {
  scanf("%d%d", &n, &k);
  int i, j, l;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &a[i][j]);
    }
  }
  for (i = 0; i < (n / 2); i++) dp[0][1 << i] = 1;
  for (i = 1; i < (1 << ((n / 2))); i++) {
    if (dp[0][i]) {
      cur.clear();
      for (j = 0; j < ((n / 2)); j++) {
        if ((i & (1 << j))) {
          cur.push_back(j);
        }
      }
      for (j = 0; j < ((n / 2)); j++) {
        if (!(i & (1 << j))) {
          int chk = 0;
          for (l = 0; l < cur.size(); l++) {
            if (cur[l] != j) {
              if (!a[cur[l]][j]) {
                chk = 1;
                break;
              }
            }
          }
          if (!chk) dp[0][i + (1 << j)] = dp[0][i] + 1;
        }
      }
    } else {
      for (j = 0; j < (n / 2); j++) {
        if (i & (1 << j)) {
          dp[0][i] = max(dp[0][i], dp[0][i - (1 << j)]);
        }
      }
    }
  }
  for (i = 0; i < (n - (n / 2)); i++) dp[1][1 << i] = 1;
  for (i = 1; i < (1 << (n - (n / 2))); i++) {
    if (dp[1][i]) {
      cur.clear();
      for (j = 0; j < (n - (n / 2)); j++) {
        if ((i & (1 << j))) {
          cur.push_back(j);
        }
      }
      for (j = 0; j < (n - (n / 2)); j++) {
        if (!(i & (1 << j))) {
          int chk = 0;
          for (l = 0; l < cur.size(); l++) {
            if (cur[l] != j) {
              if (!a[cur[l] + (n / 2)][j + (n / 2)]) {
                chk = 1;
                break;
              }
            }
          }
          if (!chk) dp[1][i + (1 << j)] = dp[1][i] + 1;
        }
      }
    } else {
      for (j = 0; j < (n - (n / 2)); j++) {
        if (i & (1 << j)) {
          dp[1][i] = max(dp[1][i], dp[1][i - (1 << j)]);
        }
      }
    }
  }
  for (i = 0; i < (1 << (n - (n / 2))); i++) {
    cur.clear();
    path.clear();
    int cnt = 0;
    for (j = 0; j < (n - (n / 2)); j++) {
      if (i & (1 << j)) {
        cur.push_back(j);
        cnt++;
      }
    }
    if (dp[1][i] != cnt) continue;
    int mask = 0;
    for (j = 0; j < ((n / 2)); j++) {
      int chk = 0;
      for (l = 0; l < cur.size(); l++) {
        if (!a[cur[l] + (n / 2)][j]) {
          chk = 1;
          break;
        }
      }
      if (!chk) mask += (1 << j);
    }
    m = max(m, dp[0][mask] + cnt);
  }
  printf("%lf\n", ((double)k * k * (1 - ((double)1 / m)) / 2));
  return 0;
}
