#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vb = vector<bool>;
using vvb = vector<vb>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define rep(i, s, n) for(int i = (int)(s); i < (int)(n); ++i)

ll INF = 1ll << 60;

ll t[8][8];

int main(){
  int n, k;
  cin >> n >> k;
  rep(i, 0, n){
    rep(j, 0, n){
      cin >> t[i][j];
    }
  }
  
  vi index(0);
  rep(i, 0, n)
    index.push_back(i);
  
  ll cnt = 0;
  
  do{
    ll sum  = 0;
    rep(i, 0, n){
      sum += t[index[i]][index[(i+1)%n]];
    }
    if(sum == k)
      cnt++;
  }while(next_permutation(index.begin()+1, index.end()));
  
  cout << cnt << endl;
  
  return 0;
  
}
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<climits>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;i++) 
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;
    vector<int> a(m); //青色のマスの場所(初期値1)
    rep(i,m) cin >> a[i]; //青色のマスへの入力
    if(m==0){
        cout << 1 << endl; //全て白マスの場合
    }else{
        sort(a.begin(), a.end()); //昇順にソート
        int val = INT_MAX; 

        /*白マスの最小値を求める*/
        if(a[0]-1 > 0) val = min(val, a[0]-1); //左端と青色のマスとの間の白マスの数を求める
        rep(i,m-1){
            //青色のマスと青色のマスとの間の白マスの数を求める
            if(a[i+1]-a[i]-1 > 0) val = min(val, a[i+1]-a[i]-1); 
        }
        if(n-a[m-1] > 0) val = min(val, n-a[m-1]); //青色のマスと右端との間の白マスの数を求める
        /*塗りつぶす回数を求める*/
        if(val == INT_MAX) cout << 0 << endl; //全てのマスが青色のマスの場合の塗りつぶす回数
        else{
            int sum;
            if((a[0]-1)%val==0) sum=(a[0]-1)/val;
            else sum=(a[0]-1)/val+1;
            rep(i,m-1){
                if((a[i+1]-a[i]-1)%val==0) sum+=(a[i+1]-a[i]-1)/val;
                else sum+=(a[i+1]-a[i]-1)/val+1;
            }
            if((n-a[m-1])%val==0) sum+=(n-a[m-1])/val;
            else sum+=(n-a[m-1])/val+1;
            cout << sum << endl;
        }
    }
    return 0;
}