#include <bits/stdc++.h>
using namespace std;
template <class T>
T f_min(T x, T y) {
  return x < y ? x : y;
}
template <class T>
T f_max(T x, T y) {
  return x > y ? x : y;
}
template <class T>
T f_abs(T x) {
  return x < 0 ? -x : x;
}
int mi, mj;
char mp[505][505];
int dp[505][505][12];
void get_data() {
  int i, j, k;
  scanf("%d%d", &mi, &mj);
  for (i = 0; i < mi; i++) {
    scanf("%s", mp[i]);
    for (j = 0; j < mj; j++) {
      if (mp[i][j] == '.')
        dp[i][j][0] = 0;
      else
        dp[i][j][0] = 1;
    }
  }
}
int get_type(int x[], int k) {
  int i, j, tot = 0, tp = -1;
  if (k == 1) {
    for (i = 0; i < 2; i++) {
      for (j = 0; j < 2; j++) {
        if (x[i * 2 + j] == 1) tot += (1 << (i * 2 + j));
      }
    }
    return tot;
  }
  for (i = 0; i < 2; i++) {
    for (j = 0; j < 2; j++) {
      if (x[i * 2 + j] == -1) return -1;
      if (x[i * 2 + j] == 15)
        tot += (1 << (i * 2 + j));
      else if (tp == -1 || tp == x[i * 2 + j])
        tp = x[i * 2 + j];
      else
        return -1;
    }
  }
  if (tot == 15)
    return 15;
  else if (tot == tp)
    return tp;
  else
    return -1;
}
void run() {
  int i, j, k, l, hl, res = 0;
  for (k = 1, l = 2, hl = 1; l <= mi && l <= mj; k++, l <<= 1, hl <<= 1) {
    for (i = 0; i < mi; i++) {
      if (i + 1 < l) continue;
      for (j = 0; j < mj; j++) {
        if (j + 1 < l) continue;
        int a[4] = {dp[i - hl][j - hl][k - 1], dp[i - hl][j][k - 1],
                    dp[i][j - hl][k - 1], dp[i][j][k - 1]};
        dp[i][j][k] = get_type(a, k);
        if (k > 1 && dp[i][j][k] != -1) res++;
      }
    }
  }
  printf("%d\n", res);
}
int main() {
  get_data();
  run();
  return 0;
}
