#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000000
#define mod 998244353ll
int n,m;
string str[N];
ll c[N];
ll dp[5][2011][2011];
ll ksm(ll x,ll y){
ll tmp=1;
ll res=x;
while(y){
if(y&1){
tmp*=res;
tmp%=mod;
}
res*=res;
res%=mod;
y>>=1;
}
return tmp;
}
ll get_num(ll x,ll y){//xDa
ll e=c[x];
ll ee=c[x-y]*c[y];
ee%=mod;
ll res=e*(ksm(ee,998244351)) % mod;
return res;
}
ll the_path(ll x,ll y){
return get_num(x+y-2,y-1);
}
signed main(){
c[0]=1;
for(int i=1;i<=4000;i++){
c[i]=c[i-1]*i;
c[i]%=mod;
}
cin>>n>>m;
//cout<<get_num(10,2)<<endl;
for(int i=1;i<=n;i++){
cin>>str[i];
str[i]='*'+str[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[2][i][j]=dp[2][i][j-1]+dp[2][i-1][j];
dp[2][i][j]%=mod;
if(str[i][j]=='Y'){
if(str[i][j-1]=='Y'){
dp[2][i][j]+=the_path(i,j-1);
dp[2][i][j]%=mod;
}
if(str[i-1][j]=='Y'){
dp[2][i][j]+=the_path(i-1,j);
dp[2][i][j]%=mod;
}
}
}
}
//cout<<"[DEBUG]"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[3][i][j]=dp[3][i][j-1]+dp[3][i-1][j];
dp[3][i][j]%=mod;
if(str[i][j]=='Y'){
if(str[i][j-1]=='Y'){
dp[3][i][j]+=(((2*dp[2][i][j-1])%mod)+the_path(i,j-1));
dp[3][i][j]%=mod;
}
if(str[i-1][j]=='Y'){
dp[3][i][j]+=(((2*dp[2][i-1][j])%mod)+the_path(i-1,j));
dp[3][i][j]%=mod;
}
}
}
}
//cout<<"[DEBUG]"<<endl;
cout<<dp[3][n][m]<<endl;
}
AtCoder Regular Contest 157 C - YY Square
最新推荐文章于 2024-10-01 23:05:47 发布