1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include<bits/stdc++.h>
using namespace std;
#define st first
#define nd second
const int N=3113;
const int M=1000000007;

int n, ks, licznik, ile, a, b, d, z;
long long wyn;
char c;
bool tab[N][N];
int num[N*N];

void read()
{
    scanf("%d%d", &n, &ks);
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            scanf(" %c", &c);
            if(c=='.') tab[i][j]=0;
            else tab[i][j]=1;
        }
    }
}

bool masas(int f)
{
    if(tab[max(f/n-1, 0)][f%n]==1 || tab[f/n+1][f%n]==1 || tab[f/n][max(f%n-1, 0)]==1 || tab[f/n][f%n+1]==1) return 1;
    return 0;
}

void spr(int q, int w, int e)
{
    if(masas(q)){
                        tab[q/n][q%n]=1;
                        if(masas(w)){
                            tab[w/n][w%n]=1;
                            if(masas(e)){
                                wyn++;
                            }
                        }
                        else{
                            if(masas(e)){
                                tab[e/n][e%n]=1;
                                if(masas(w)){
                                wyn++;
                            }
                            }
                        }
                    }
                    tab[q/n][q%n]=0;
                    tab[w/n][w%n]=0;
                    tab[e/n][e%n]=0;
}

void spr1(int q, int w, int e, int r)
{
    if(masas(q)){
                        tab[q/n][q%n]=1;
                        spr(w, e, r);
                    }
                    tab[q/n][q%n]=0;

}

void sprawdzaj()
{
    if(ks==1){
        printf("%d", ile);
        return;
    }
    else if(ks==2){
        for(int i=0; i<ile-1; i++){
            for(int j=i+1; j<ile; j++){
                a=num[i];
                b=num[j];

                if(tab[max(a/n-1, 0)][a%n]==1 || tab[a/n+1][a%n]==1 || tab[a/n][max(a%n-1, 0)]==1 || tab[a/n][a%n+1]==1){
                    tab[a/n][a%n]=1;
                    if(tab[max(b/n-1, 0)][b%n]==1 || tab[b/n+1][b%n]==1 || tab[b/n][max(b%n-1, 0)]==1 || tab[b/n][b%n+1]==1){
                        wyn++;
                        //printf("%d %d\n", i, j);
                    }
                }
                else{
                    if(tab[max(b/n-1, 0)][b%n]==1 || tab[b/n+1][b%n]==1 || tab[b/n][max(b%n-1, 0)]==1 || tab[b/n][b%n+1]==1){
                        tab[b/n][b%n]=1;
                        if(tab[max(b/n-1, 0)][b%n]==1 || tab[b/n+1][b%n]==1 || tab[b/n][max(b%n-1, 0)]==1 || tab[b/n][b%n+1]==1){
                            wyn++;
                            //printf("%d %d\n", i, j);
                        }
                    }
                }

                tab[a/n][a%n]=0;
                tab[b/n][b%n]=0;

            }
        }
        printf("%lld", wyn%M);
        return;
    }
    else if(ks==3){
        for(int i=0; i<ile-2; i++){
            for(int j=i+1; j<ile-1; j++){
                for(int k=j+1; k<ile; k++){
                    a=num[i];
                    b=num[j];
                    d=num[k];
                    if(masas(a)){
                        tab[a/n][a%n]=1;
                        if(masas(b)){
                            tab[b/n][b%n]=1;
                            if(masas(d)){
                                wyn++;
                            }
                        }
                        else{
                            if(masas(d)){
                                tab[d/n][d%n]=1;
                                if(masas(b)){
                                wyn++;
                            }
                            }
                        }
                    }else{
                        if(masas(b)){
                            spr(b, a, d);
                        }
                        else{
                            if(masas(d)){
                                spr(d, a, b);
                            }
                        }
                    }
                }
            }
        }
        printf("%lld", wyn%M);
    }
    else if(ks==4){
        for(int i=0; i<ile-3; i++){
            for(int j=i+1; j<ile-2; j++){
                for(int k=j+1; k<ile-1; k++){
                    for(int l=k+1; l<ile; l++){
                        a=num[i];
                        b=num[j];
                        d=num[k];
                        z=num[l];
                        if(masas(a)){
                            spr1(a, b, d, z);
                        }
                        else{
                            if(masas(b)){
                                spr1(b, a, d, z);
                            }
                            else{
                                if(masas(d)){
                                    spr1(d,a,b,z);
                                }
                                else{
                                    if(masas(z)){
                                        spr1(z,a,b,d);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        printf("%lld", wyn%M);
    }
}

int main()
{
    read();
    /*for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            printf("%d ", tab[i][j]);
        }
        printf("\n");
    }*/
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(tab[i][j]==0){
                num[licznik]=i*n+j;
                licznik++;
            }
        }
    }
    ile=licznik;
    /*for(int i=0; i<n*n; i++){
        printf("%d ", num[i]);
    }*/
    sprawdzaj();
    return 0;
}