rt。思路:枚举多少列分割线,此时行分割线的个数确定,简单计数就好了。
#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T& x) {
char c;int f{1};
do x=(c=getchar())^48;
while (!isdigit(c)&&c!='-');
if (x==29) f=-1,x=0;
while (isdigit(c=getchar()))
x=(x<<3)+(x<<1)+(c^48);
x*=f;
}
template <typename T,typename ...Args>
void read(T& x,Args&... args) {read(x);read(args...);}
constexpr int b6e0{998244353};
char mp[2005][2005];
int cc[2005],cr[2005];
int main() {
int n,m;read(n,m);
int ct{0};
for (int i{1};i<=n;++i) {
scanf("%s",mp[i]+1);
for (int j{1};j<=m;++j)
if (mp[i][j]=='Y')
++cc[j],++cr[i],++ct;
}
if (ct&1) {
puts("0");
return 0;
}
ct>>=1;
int ans{0};
for (int c{1};c<=ct&&c<=m;++c)
if (ct%c==0) {
int r{ct/c};
int fp{1},cnt,sas{1};
int CT{ct<<1};
for (int i{1};i<=c;++i) {
cnt=0;
while (fp<=m&&cnt<CT/c) cnt+=cc[fp++];
if (cnt!=CT/c) goto bed;
cnt=1;
while (fp<=m&&!cc[fp]) ++cnt,++fp;
sas=1LL*sas*cnt%b6e0;
}
fp=1;
for (int i{1};i<=r;++i) {
cnt=0;
while (fp<=n&&cnt<CT/r) cnt+=cr[fp++];
if (cnt!=CT/r) goto bed;
cnt=1;
while (fp<=n&&!cr[fp]) ++cnt,++fp;
sas=1LL*sas*cnt%b6e0;
}
(ans+=sas)%=b6e0;
bed:;
}
cout<<ans<<endl;
return 0;
}