ARC D求调
  • 板块学术版
  • 楼主ppip嘟嘟嘟
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/2/25 22:02
  • 上次更新2023/10/23 23:45:52
查看原帖
ARC D求调
374433
ppip嘟嘟嘟楼主2023/2/25 22:02

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;
}
2023/2/25 22:02
加载中...