#include <bits/stdc++.h>
using namespace std;
 
int main(){
  int h,w;
  cin >> h >> w;
  vector<string> s(h);
  for(int i=0;i < h;i++){
    cin >> s.at(i);
  }
  
  long long ans = 0;
  for(int i=0;i < h;i ++){
    int mae = 0;
    for(int j = 0;j < w;j++){
      if(s.at(i).at(j) == '.'){
        if(mae == 1){
          ans ++;
        }
        mae = 1;
      }
      else{
        mae = 0;
      }
    }
  }
    for(int i=0;i < w;i ++){
    int mae = 0;
    for(int j = 0;j < h;j++){
      if(s.at(j).at(i) == '.'){
        if(mae == 1){
          ans ++;
        }
        mae = 1;
      }
      else{
        mae = 0;
      }
    }
  }
  cout << ans << endl;
}
// どこが間違っているか分からない時は,簡単なミス(型,スペル,入力or出力など)をしていたり問題文の見落としがあったりする. 一度落ち着いて頭をリセットしよう.
// 計算途中のオーバーフローに注意しよう

#include "bits/stdc++.h"

#define REP(i, n, N) for(ll i=(n); i<(N); i++)
#define RREP(i, n, N) for(ll i=(N-1); i>=(n); i--)
#define LREP(lst,itr) for(auto itr = lst.begin(); itr != lst.end(); ++itr)
#define CK(n, a, b) ((a)<=(n)&&(n)<(b))
#define ALL(v) (v).begin(),(v).end()
#define MCP(a, b) memcpy(b,a,sizeof(b))
#define P(s) cout<<(s)<<endl
#define P2(a, b) cout<<(a)<<" "<<(b)<<endl
#define P3(a, b, c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define PP(val, pre) cout<<fixed<<setprecision(pre)<<val<<endl
#define V2(T) vector<vector<T>>
typedef long long ll;
using namespace std;
const ll MOD = 1e9 + 7;
const ll INF = 1e18;

int main(){
    ll N, M;
    cin >> N >> M;
    ll odd = 0, even = 0;
    REP(i, 0, N){
        string S;
        cin >> S;
        int cnt=0;
        REP(i, 0, M) if(S[i]=='1') cnt++;
        if(cnt%2==0){
            even++;
        }else{
            odd++;
        }
    }
    P(N*(N-1)/2-even*(even-1)/2-odd*(odd-1)/2);
}