plant你们是多测不清空,我是直接忘了搞多测
#include<iostream>
#include<cstdio>
#define rep(i,x,n) for(int i=x;i<=n;i++)
using namespace std;
inline int Read(){
int dat=0,f=1; char ch=getchar();
while(ch<'0' || '9'<ch){ if(ch=='-') f=-f; ch=getchar(); }
while('0'<=ch && ch<='9'){ dat=(dat<<3)+(dat<<1)+ch-'0'; ch=getchar(); }
return dat*f;
}
void _write(int dat){
if(dat/10) _write(dat/10);
putchar('0'+dat%10);
}
void Write(int dat){
if(dat<0){ putchar('-'); dat=-dat; }
_write(dat);
}
const int maxN=1e3+5,mod=998244353;
int n,m,t,id,c,f;
long long dpc[maxN],add[maxN][maxN],ccfNB666[maxN][maxN],dpf[maxN],r[maxN][maxN],sum[maxN][maxN];
char s[maxN][maxN];
bool a[maxN][maxN],space[maxN][maxN];
int main(){
//freopen("plant.in","r",stdin);
//freopen("plant.out","w",stdout);
t=Read(),id=Read();
n=Read(),m=Read(),c=Read(),f=Read();
for(int i=0;i<n;i++) scanf("%s",s[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i+1][j+1]=s[i][j]=='1' ? 1 : 0;
for(int cnt,j=1;j<=m;j++){//calculate space
cnt=0;
for(int i=1;i<=n;i++){
if(!a[i][j]){
cnt++;
if(cnt>=3) space[i][j]=1;
}
else cnt=0;
}
}
for(int cnt,i=1;i<=n;i++){//calculate r
cnt=0;
for(int j=m;j>=1;j--){
if(a[i][j]) cnt=0;
else{
r[i][j]=cnt;
cnt++;
}
}
}
for(int j=1;j<=m;j++){//calculate sum
for(int i=1;i<=n;i++){
if(a[i][j]) continue;
sum[i][j]=(sum[i-1][j]+r[i][j])%mod;
}
}
for(int i=1;i<=n;i++){
if(i<3) continue;
dpc[i]=dpc[i-1];
for(int j=1;j<=m;j++){
if(!space[i][j]) continue;
dpc[i]=(dpc[i]+(add[i][j]=(sum[i-2][j]*r[i][j])%mod))%mod;
}
}
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++){
if(!space[i][j]) continue;
ccfNB666[i][j]=(ccfNB666[i-1][j]+add[i][j])%mod;
}
for(int i=1;i<=n;i++){
if(i<4) continue;
dpf[i]=dpf[i-1];
for(int j=1;j<=m;j++){
if(!space[i][j]) continue;
dpf[i]=(dpf[i]+ccfNB666[i-1][j])%mod;
}
}
Write(c*dpc[n]%mod); putchar(' '); Write(f*dpf[n]%mod);
return 0;
}
把代码吊在这里警示后人:
当ccf给了你大数据,一定要检查是否覆盖到了题中给的所有数据范围,如果没有,一定要自己造一个能覆盖到所有范围的数据。