大概率是你输入的时候getchar()读错了,建议在输完n,m,c,f,后再getchar(),并在读取最后一组数据的最后一行时不要getchar()(民间数据造的怪怪的),最后,楼主爆longlong了,不知道怎么爆的,也挺奇怪的,要是有人能帮忙看看就更好了QWQ
#include<bits/stdc++.h>
using namespace std;
#define in long long
int t,ID,dp2[1010][1010],dp[1010][1010],qz2[1010][1010],qz1[1010][1010],n,m,c,f,ansc,ansf;
const int mod=998244353ll;
int a[1010][1010];
void read(int &x)
{
x=0;char ch=getchar();
while(ch<48||ch>57) ch=getchar();
x=ch-48;ch=getchar();
while(ch>48&&ch<57) x=x*10+ch-48,ch=getchar();
}
signed main()
{
cin>>t>>ID;
while(t--)
{
memset(dp,0,sizeof(dp));
memset(dp2,0,sizeof(dp2));
memset(qz1,0,sizeof(qz1));
memset(qz2,0,sizeof(qz2));
memset(a,0,sizeof(a));
ansc=0ll,ansf=0ll;
cin>>n>>m>>c>>f;getchar();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
a[i][j]=getchar()-48;
if(!t||i!=n)getchar();
}
/* for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
cout<<a[i][j]<<" ";
puts("");
}*/
int p=1ll,las=0ll;
for(int i=1;i<=n;++i)
{
p=1ll,las=0ll;
while(p<=m)
{
if(a[i][p])
{
for(int j=las+1;j<p;++j)
dp[i][j]=p-j-1ll;
las=p;
}
++p;
}
for(int j=las+1;j<p;++j)
dp[i][j]=p-j-1ll;
}
for(int j=1;j<=m;++j)
{
p=1ll,las=0ll;
while(p<=n)
{
if(a[p][j])
{
for(int i=las+1;i<p;++i)
dp2[i][j]=p-i-1ll;
las=p;
}
++p;
}
for(int i=las+1;i<p;++i)
dp2[i][j]=p-i-1ll;
}
ansc=0ll,ansf=0ll;
for(int j=1;j<=m;++j)
{
int pz=0ll;
for(int i=1;i<=n;++i)
pz+=dp[i][j],pz%=mod,qz1[i][j]=pz;
}
for(int j=1;j<=m;++j)
{
int pz=0ll;
for(int i=1;i<=n;++i)
pz=(pz+dp[i][j]*dp2[i][j]%mod)%mod,qz2[i][j]=pz;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(i<=n-2)
{
ansc=(ansc+(((qz1[i+dp2[i][j]][j]-qz1[i+1][j])%mod)*dp[i][j])%mod)%mod;
}
if(i<=n-3)
ansf=(ansf+(((qz2[i+dp2[i][j]][j]-qz2[i+1][j])%mod)*dp[i][j])%mod)%mod;
}
}
printf("%lld %lld\n",(c*ansc)%mod,(f*ansf)%mod);
}
}