#include <iostream>

using namespace std;

struct pos{
    int x;
    int y;
};



bool check(int matrica[2000][2000], pos startPos, pos endPos, int value, int pojavljivanja){
    //cout << startPos.x <<" "<< startPos.y << " " << endPos.x << " " << endPos.y << "| " << value << endl;
    /*if(startPos.x == endPos.x || startPos.y == endPos.y){
        return false;
    }*/
    int duzina = endPos.x - startPos.x + 1;
    int sirina = endPos.y - startPos.y + 1;
    if(duzina * sirina != pojavljivanja || pojavljivanja == 0){
        return false;
    }
    for(int i = startPos.x; i <= endPos.x; i++){
        for(int j = startPos.y; j <= endPos.y; j++){
            if(matrica[i][j] != value){
                //cout << "False" << endl;
                return false;
                //cout << "False" << endl;
            }
        }
    }
    //cout << "True" << endl;
    return true;

}
pos pocetak[1000001];
pos kraj[1000001];
int brojPojavljivanja[1000001];

int main()
{
    //freopen("Input.txt", "r", stdin);
    int N, K;
    cin >> N >> K;
    int pogodneTeritorije = 0;
    static int vocnjak[2000][2000];

    for(int i = 0; i <= K; i++){
        pocetak[i].x = -1;
        pocetak[i].y = -1;
        brojPojavljivanja[i] = 0;
    }
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            cin >> vocnjak[i][j];
            ++brojPojavljivanja[vocnjak[i][j]];
            if(pocetak[vocnjak[i][j]].x == -1){
                pocetak[vocnjak[i][j]].x = i;
                pocetak[vocnjak[i][j]].y = j;
            }
            kraj[vocnjak[i][j]].x = i;
            kraj[vocnjak[i][j]].y = j;
        }
    }
    for(int i = 1; i <= K; i++){
        if(check(vocnjak, pocetak[i], kraj[i], i, brojPojavljivanja[i])){
            pogodneTeritorije++;
        }
    }
    cout << pogodneTeritorije;
    //system("PAUSE");
    return 0;
}