#include using namespace std; typedef long long ll; int n, k; ll p, d, t; const ll m = 1e9 + 7; int T[3001][3001]; int d_x[] = {-1, 1, 0, 0}; int d_y[] = {0, 0, 1, -1}; ll counter_p(ll ctr) { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'w') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'k') { T[i][j] = 'p'; } } } } } if(T[i][j] == ctr) res++; } } return res; } ll counter_d(ll ctr) { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'w') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'p') { T[i][j] = 'd'; } } } } } if(T[i][j] == ctr) res++; } } return res; } ll counter_t(ll ctr) { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'w') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'd' || T[i + d_x[q]][j + d_y[q]] == 't'+1) { T[i][j] = 't'; } } } } } if(T[i][j] == 'd') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'd' || T[i + d_x[q]][j + d_y[q]] == 't'+1) { T[i][j] = 't'+1; } } } } } if(T[i][j] == ctr) res++; } } return res; } ll sumaTakichZePiD() { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'p') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'd' || T[i + d_x[q]][j + d_y[q]] == 't'+1) { res++; res%=m; } } } } } } } return res%m; } ll sumaIloczynowD() { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'p') { ll tmp = 0; for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'd' || T[i + d_x[q]][j + d_y[q]] == 't'+1) { tmp++; } } } } res += ((((tmp%m)*((tmp-1)%m))%m)*500000004)%m; } } } return res%m; } ll sumaTakichAAB() { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'd' || T[i][j] == 't'+1) { ll tmp = 0; for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'p') { tmp++; } } } } res += ((((tmp%m)*((tmp-1)%m))%m)*500000004)%m; res += ((tmp%m)*((m+p-tmp)%m))%m; } } } return res%m; } ll ileTychT() { ll res = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(T[i][j] == 'p') { for(int q = 0; q < 4; q++) { if(1 <= i + d_x[q] && i + d_x[q] <= n) { if(1 <= j + d_y[q] && j + d_y[q] <= n) { if(T[i + d_x[q]][j + d_y[q]] == 'd' || T[i + d_x[q]][j + d_y[q]] == 't'+1) { for(int h = 0; h < 4; h++) { if(1 <= i + d_x[q] + d_x[h] && i + d_x[q] + d_x[h] <= n) { if(1 <= j + d_y[q] + d_y[h] && j + d_y[q] + d_y[h] <= n) { if(T[i + d_x[q] + d_x[h]][j + d_y[q] + d_y[h]] == 't' || T[i + d_x[q] + d_x[h]][j + d_y[q] + d_y[h]] == 't'+1) { res++; res%=m; } } } } } } } } } } } return res%m; } int main() { ios_base::sync_with_stdio(false); cin >> n >> k; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { char c; cin >> c; if(c == '.') T[i][j] = 'w'; else T[i][j] = 'k'; } } p = counter_p('p'); d = counter_d('d'); t = counter_t('t'); if(k == 1) { cout << p % m << endl; } else if(k == 2) { ll sameP = ((((p%m)*((m+p-1)%m))%m)*500000004)%m; cout << (sameP%m + sumaTakichZePiD()%m) % m << endl; } else if(k == 3) { ll sameP = (((((p%m)*((m+p-1)%m))%m*((m+p-2)%m))%m)*166666668)%m; cout << (((sameP%m + sumaTakichAAB()%m)%m + sumaIloczynowD()%m)%m + ileTychT()%m)%m << endl; } else if(k == 4) { } return 0; }