#include <bits/stdc++.h>
using namespace std;
long long ANS = 0;
int yy, xx;
int a[500][500];
int dyn[500][500][10][2][2][2][2];
int amount[500][500];
int Log[1000];
int pattern[2][2];
bool Fill(int x, int y, int add) {
  if (x == 0 && y == 0)
    return amount[x + add - 1][y + add - 1] == add * add;
  else if (x == 0)
    return amount[x + add - 1][y + add - 1] - amount[x + add - 1][y - 1] ==
           add * add;
  else if (y == 0)
    return amount[x + add - 1][y + add - 1] - amount[x - 1][y + add - 1] ==
           add * add;
  else
    return amount[x + add - 1][y + add - 1] - amount[x + add - 1][y - 1] -
               amount[x - 1][y + add - 1] + amount[x - 1][y - 1] ==
           add * add;
}
bool Emp(int x, int y, int add) {
  if (x == 0 && y == 0)
    return amount[x + add - 1][y + add - 1] == 0;
  else if (x == 0)
    return amount[x + add - 1][y + add - 1] - amount[x + add - 1][y - 1] == 0;
  else if (y == 0)
    return amount[x + add - 1][y + add - 1] - amount[x - 1][y + add - 1] == 0;
  else
    return amount[x + add - 1][y + add - 1] - amount[x + add - 1][y - 1] -
               amount[x - 1][y + add - 1] + amount[x - 1][y - 1] ==
           0;
}
bool fractal(int x, int y, int add) {
  if (dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
         [pattern[1][1]] != 0)
    return dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
              [pattern[1][1]] == 2;
  if (add == 2) {
    bool ans = true;
    for (int i = 0; i < 2; i++)
      for (int j = 0; j < 2; j++) ans = ans && a[x + j][y + i] == pattern[j][i];
    dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
       [pattern[1][1]] = ans + 1;
    return dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
              [pattern[1][1]] == 2;
  }
  bool ans = true;
  for (int i = 0; i < 2 && ans; i++)
    for (int j = 0; j < 2 && ans; j++)
      if (pattern[j][i] != 1)
        ans = ans && fractal(x + j * add / 2, y + i * add / 2, add / 2);
      else
        ans = ans && Fill(x + j * add / 2, y + i * add / 2, add / 2);
  dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
     [pattern[1][1]] = ans + 1;
  return dyn[x][y][Log[add]][pattern[0][0]][pattern[1][0]][pattern[0][1]]
            [pattern[1][1]] == 2;
}
int main() {
  Log[1] = 0;
  Log[2] = 1;
  Log[4] = 2;
  Log[8] = 3;
  Log[16] = 4;
  Log[32] = 5;
  Log[64] = 6;
  Log[128] = 7;
  Log[256] = 8;
  cin >> yy >> xx;
  char c;
  for (int i = 0; i < yy; i++)
    for (int j = 0; j < xx; j++) {
      cin >> c;
      if (c == '.')
        a[j][i] = 0;
      else
        a[j][i] = 1;
      if (i == 0 && j == 0)
        amount[j][i] = a[j][i];
      else if (i == 0)
        amount[j][i] = amount[j - 1][i] + a[j][i];
      else if (j == 0)
        amount[j][i] = amount[j][i - 1] + a[j][i];
      else
        amount[j][i] = amount[j][i - 1] + amount[j - 1][i] -
                       amount[j - 1][i - 1] + a[j][i];
    }
  int add = 8;
  while (add <= min(xx, yy)) add *= 2;
  add /= 2;
  for (int iadd = 4; iadd <= add; iadd *= 2) {
    for (int i = 0; i <= yy - iadd; i++)
      for (int j = 0; j <= xx - iadd; j++) {
        for (int p1 = 0; p1 < 2; p1++)
          for (int p2 = 0; p2 < 2; p2++)
            for (int p3 = 0; p3 < 2; p3++)
              for (int p4 = 0; p4 < 2; p4++) {
                pattern[0][0] = p1;
                pattern[1][0] = p2;
                pattern[0][1] = p3;
                pattern[1][1] = p4;
                if (fractal(j, i, iadd)) {
                  ANS++;
                }
              }
      }
  }
  cout << ANS << endl;
  return 0;
}
