#include "bits/stdc++.h"
#include "ext/pb_ds/assoc_container.hpp"
#include "ext/pb_ds/tree_policy.hpp"
using namespace std;
 
#pragma GCC optimize("O3","unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC target("avx2")
 
#define sync ios_base::sync_with_stdio(0); cin.tie(0);
#define all(x) x.begin(),x.end()
#define unq(a) sort(all(a));a.resize(unique(all(a)) - a.begin())
#define ll long long
#define ld float
#define pb push_back
#define fi first
#define se second
#define endl '\n'
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937 rng(1);
using pii = pair<int , int>;
 
int inline max(const int x, const int y){return (x > y ? x : y);}
int inline min(const int x, const int y){return (x < y ? x : y);}
int inline abs(const int x){return (x < 0 ? -x : x);}

const int N = 2e5 + 5, mod = 1e9 + 7;

ll power(ll x, ll y){
  ll r = 1;
  while(y > 0){
    if (y & 1){
      r *= x; r %= mod;
    }
    y >>= 1;
    x *= x; x %= mod;
  }
  return r;
}

int main(){
 
    #ifndef ONLINE_JUDGE 
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
 
    sync
 
    int t = 1;
    //cin >> t;
    while(t--){
      int n;
      cin >> n;
      vector<ll> a(n);
      for (ll& x : a) cin >> x;
      ll cnt = 0;
      vector<ll> dp0(n + 1), dp1(n + 1), ways(n + 1);
      dp0[1] = dp1[1] = 1;
      ways[0] = 1; ways[1] = 2;
      for (int i = 2; i <= n; i++){
        dp0[i] = dp1[i - 1]; // minus
        dp1[i] = dp0[i - 1] + dp1[i - 1]; // plus
        dp0[i] %= mod; dp1[i] %= mod;
        ways[i] = (dp0[i] + dp1[i]) % mod; 
      }
      cnt = (ways[n - 1] * a[0]) % mod;
      for (int i = 1; i < n; i++){
        int l = i - 1, r = n - i - 1;
        cnt += ((ways[l] * ways[r]) % mod * a[i]) % mod; cnt %= mod;
        //cout << a[i] << " -> " << ways[l] * ways[r] << endl;
        l--; r--;
        l = max(l , 0); r = max(r , 0);
        cnt += ((ways[l] * ways[r]) % mod * (mod - a[i]) % mod) % mod; cnt %= mod;
        //cout << -a[i] << " -> " << ways[l] * ways[r] << endl;
      }
      cout << cnt << endl;
    }
    cerr << "processor time: " << clock() / (double) CLOCKS_PER_SEC << "s    ";
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
// 型
#define ll int64_t                  // ll -> int64_t
using graph = vector<vector<int>>;  // グラフ型
// for文
#define lp(i,n) for(int i=0;i<n;i++)      // 変数 i をおいて n 回繰り返し
#define lp_(i,n) for(int i=0;i<=n;i++)    // 条件に＝つき
#define lpp(i,n,m) for(int i=n;i<m;i++)   // 開始と終了を指定して繰り返し
#define lpp_(i,n,m) for(int i=n;i<=m;i++) // 開始と終了を指定，条件に＝つき
// vector定義
#define _GLIBCXX_DEBUG
#define vec(v,n) vector<int> v(n)       // int
#define vec_(v,n,m) vector<int> v(n,m)  // int 初期条件あり
#define vec64(v,n) vector<ll> v(n)      // int64_t
#define vec64_(v,n,m) vector<ll> v(n,m) // int64_t 初期条件あり
#define vecc(v,n) vector<char> v(n)     // char
#define vecs(v,n) vector<string> v(n)   // string
#define vece(v) vector<int> v;          // int 空
#define vecec(v) vector<char> v;        // char 空
#define vec2i(v,h,w) vector<vector<int>> v(h,vector<int>(w))    // 二次元配列 int
#define vec2c(v,h,w) vector<vector<char>> v(h,vector<char>(w))  // 二次元配列 char
// vector,string操作
#define all(v) v.begin(),v.end()
#define back(v) v.back()                         // 最後の要素
#define sum(v) accumulate(all(v),0)              // 総和
#define sort(v) sort(all(v))                     // ソート
#define reverse(v) reverse(all(v))               // 反転
#define lower(v,x) lower_bound(all(v),x)-v       // x<=a[i]となる最小のi / a[i]<xとなるiの個数
#define cou(v,n) count(all(v),n)               // n の出現回数を数える
#define pb(v,n) v.push_back(n)                   // 最後尾に n を追加
#define ins(v,i,n) v.insert(v.begin()+i,n)       // 場所を指定してv[i]に n を追加
#define del(v) v.pop_back()                      // 最後尾を削除
#define del0(v) v.erase(v.begin())               // 最初の要素v[0]を削除
#define del_(v,i) v.erase(v.begin()+i)           // 場所を指定してv[i]を削除
#define del__(v,i,j) v.erase(v.begin()+i,v.begin()+j+1)  // 範囲を指定してv[i]~v[j]を削除
#define sub(s,i,j) s.substr(i,j-i+1)             // 範囲を指定してs[i]~s[j]を取得【stringのみ】
// others
const ll MOD=998244353;
const ll INF=(1LL<<60);
#define under(n) cout<<fixed<<setprecision(n) // 小数点以下の桁数を指定
#define cout(n) cout<<n<<endl
#define mypair pair<int,int>


int main()
{
  ll ans=1;
  int h,w;
  cin>>h>>w;
  vec2c(a,h,w);
  lp(i,h)
  {
    lp(j,w)
      cin>>a[i][j];
  }
  for(int i=1;i<w;i++)
  {
    int flag=0;
    int px=0,py=i;
    for(;;)
    {
      if(a[px][py]=='R')
      {
        if(flag==0||flag==1)
          flag=1;
        else
        {
          ans=0;
          //goto EN;
        }
      }
      else if(a[px][py]=='B')
      {
        if(flag==0||flag==2)
          flag=2;
        else
        {
          ans=0;
          //goto EN;
        }
      }
      px++;
      py--;
      if(px>=h||py<0)
        break;
    }
    if(flag==0)
    {
      ans*=2;
      ans%=MOD;
    }
  }

  for(int i=1;i<h-1;i++)
  {
    int flag=0;
    int px=i,py=w-1;
    for(;;)
    {
      if(a[px][py]=='R')
      {
        if(flag==0||flag==1)
          flag=1;
        else
        {
          ans=0;
          //goto EN;
        }
      }
      else if(a[px][py]=='B')
      {
        if(flag==0||flag==2)
          flag=2;
        else
        {
          ans=0;
          //goto EN;
        }
      }
      px++;
      py--;
      if(px>=h||py<0)
        break;
    }
    if(flag==0)
    {
      ans*=2;
      ans%=MOD;
    }
  }
  if(a[0][0]=='.')
  {
    ans*=2;
    ans%=MOD;
  }
  if(a[h-1][w-1]=='.')
  {
    ans*=2;
    ans%=MOD;
  }
  cout(ans);
}
