#include <bits/stdc++.h>
using namespace std;
 
int main(){
    long n, m, mod = 998244353, ans = 0, mans, a, k, h = 200001;
    cin >> n >> m;
    long dp[19][h];
    bool s[h] = {};
    vector<long> v;
    for(int i = 2; i < h; i++){
        if(s[i] == 0){
            v.push_back(i);
            for(int j = 2 * i; j < h; j += i) s[j] = 1;
        }
    }
    for(int i = 0; i < 19; i++) dp[i][0] = 0;
    for(int i = 1; i < h; i++){
        dp[0][i] = 1;
        for(int j = 1; j < 19; j++) dp[j][i] = (dp[j - 1][i] + dp[j][i - 1]) % mod;
    }
    for(int i = 1; i <= m; i++){
        mans = 1;
        a = i;
        for(int j = 0; j < v.size(); j++){
            if(sqrt(a) < v[j]){
                if(a > 1) mans = mans * dp[1][n] % mod;
                break;
            }
            k = 0;
            while(a % v[j] == 0){
                k++;
                a /= v[j];
            }
            mans = mans * dp[k][n] % mod;
        }
        ans = (ans + mans) % mod;
    }
    cout << ans << endl;
}
#include<bits/stdc++.h>
typedef int64_t i64;
typedef long double f128;
using namespace std;

template<typename T>
void scan(T& n)
{
  cin>>n;
  return;
}

void scan()
{
  return;
}

template<typename T,class... Args>
void scan(T& n,Args&... args)
{
  scan(n);
  scan(args...);
  return;
}

template<typename T>
void scan_array(T start,T end)
{
  T now=start;
  for(;now!=end;++now)
  {
    scan(*now);
  }
  return;
}

template<typename T>
void print(T n)
{
  cout<<n;
  return;
}

template<typename T>
void println(T n)
{
  print(n);
  print('\n');
  return;
}

template<typename T,class... Args>
void println(T n,Args... args)
{
  print(n);
  print(' ');
  println(args...);
  return;
}

template<typename T>
void print_array(T start,T end)
{
  T now=start;
  print(*now);
  ++now;
  for(;now!=end;++now)
  {
    print(' ');
    print(*now);
  }
  print('\n');
  return;
}

i64 pow_mod(i64 a,i64 n,i64 mod)
{
  i64 res=1,now=a;
  while(n)
  {
    if(n&1)
    {
      res=res*now%mod;
    }
    now=now*now%mod;
    n>>=1;
  }
  return res;
}

i64 inv_mod(i64 a,i64 mod)
{
  return pow_mod(a,mod-2,mod);
}

int main()
{
  i64 constexpr mod=1000000007;
  i64 H,W;
  scan(H,W);
  vector<string> S(H);
  scan_array(S.begin(),S.end());
  i64 K=0;
  for(i64 i=0;i<H;++i)
  {
    for(i64 j=0;j<W;++j)
    {
      if(S[i][j]=='.')
      {
        K+=1;
      }
    }
  }
  i64 d[H][W],u[H][W],r[H][W],l[H][W];
  for(int j=0;j<W;++j)
  {
    int now=0;
    for(int i=0;i<H;++i)
    {
      now=(S[i][j]=='#')?0:now+1;
      d[i][j]=now;
    }
    now=0;
    for(int i=H-1;i>=0;--i)
    {
      now=(S[i][j]=='#')?0:now+1;
      u[i][j]=now;
    }
  }
  for(int i=0;i<H;++i)
  {
    int now=0;
    for(int j=0;j<W;++j)
    {
      now=(S[i][j]=='#')?0:now+1;
      r[i][j]=now;
    }
    now=0;
    for(int j=W-1;j>=0;--j)
    {
      now=(S[i][j]=='#')?0:now+1;
      l[i][j]=now;
    }
  }
  i64 sum=0;
  for(int i=0;i<H;++i)
  {
    for(int j=0;j<W;++j)
    {
      if(S[i][j]=='.')
      {
        sum+=pow_mod(2,K-(l[i][j]+r[i][j]+u[i][j]+d[i][j]-3),mod);
      }
    }
  }
  sum%=mod;
  i64 ans=pow_mod(2,K,mod)*K%mod-sum;
  ans=(ans%mod+mod)%mod;
  println(ans);
}