#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
#define print(x) cout << (x) << endl
typedef long long ll;
const ll MOD = 1000000007;
const ll MOD2 = 998244353;
 
using namespace std;
using Graph = vector<vector<int>>;

struct UnionFind {
    vector<int> par, siz;

    UnionFind(int sz): par(sz), siz(sz, 1) {
        for (int i = 0; i < sz; ++i) par[i] = i;
    }
    void init(int sz) {
        par.resize(sz);
        siz.assign(sz, 1);
        for (int i = 0; i < sz; i++) par[i] = i;
    }

    int root(int x) {
        while (par[x] != x) {
            x = par[x] = par[par[x]];
        }
        return x;
    }

    bool merge(int x, int y) {
        x = root(x);
        y = root(y);
        if (x == y) return false;
        if (siz[x] < siz[y]) swap(x, y);
        siz[x] += siz[y];
        par[y] = x;
        return true;
    }

    bool issame(int x, int y) {
        return root(x) == root(y);
    }

    int size(int x) {
        return siz[root(x)];
    }
};

int main(){
    int n, K;   cin >> n >> K;
    int a[n][n];
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin >> a[i][j];
    //列に関して
    UnionFind ufc(n);
    //行に関して
    UnionFind ufr(n);
    for(int i=0; i<n-1; i++){
        for(int j=i+1; j<n; j++){
            int cnt = 0;
            for(int k=0; k<n; k++){
                if(a[i][k] + a[j][k] <= K) cnt++;
            }
            if(cnt == n) ufc.merge(i,j);
        }
    }
    for(int i=0; i<n-1; i++){
        for(int j=i+1; j<n; j++){
            int cnt = 0;
            for(int k=0; k<n; k++){
                if(a[k][i] + a[k][j] <= K) cnt++;
            }
            if(cnt == n) ufr.merge(i,j);
        }
    }

    vector<ll> floor(K+2,1);
    ll tmp = 1;
    for(int i=1; i<K+2; i++){
        tmp *= i;
        tmp %= MOD2;
        floor[i] = tmp;
    }

    vector<int> cc(n,0), cr(n,0);
    tmp = 1;
    for(int i=0; i<n; i++){
        int t = ufc.root(i);
        if(cc[t] == 0){
            tmp = tmp * floor[ufc.size(i)] % MOD2;
            cc[t] = 1;
        }
    }
    for(int i=0; i<n; i++){
        int t = ufr.root(i);
        if(cr[t] == 0){
            tmp = tmp * floor[ufr.size(i)] % MOD2;
            cr[t] = 1;
        }
    }
    print(tmp);
}
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n,k;
    cin >> n >> k;
    ll ans = 0;
    vector<int> cnt(n);
    for (int i = 0; i < n; i++) cnt[i] = 0;
    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;
        cnt[a]++;
    }
    unordered_map<int,bool> mp[k];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < min(cnt[i],k); j++) {
            mp[j][i] = true;
        }
    }
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < n; j++) {
            if (!mp[i][j]) {
                ans += j;
                break;
            }
        }
    }
    cout << ans << endl;
}