#include <bits/stdc++.h>
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;
}