86求助,只有最后一个点第一组的F错了
查看原帖
86求助,只有最后一个点第一组的F错了
1057222
mountzhu楼主2024/6/26 21:01
#include<bits/stdc++.h>
using namespace std;
char a[1001];
int n,m,C,F,T,id,mapi[1001][1001],f[1001][1001],f1[1001][1001];
unsigned long long ans,ans1,mo=998244353;
int main(){
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	scanf("%d %d",&T,&id);
	for(register int j=1;j<=T;j++){
		scanf("%d %d %d %d",&n,&m,&C,&F);
		ans=0,ans1=0;
		memset(a,0,sizeof(a)),memset(mapi,0,sizeof(mapi)),memset(f,0,sizeof(f)),memset(f1,0,sizeof(f1));
		for(register int i=1;i<=n;i++){
			scanf("%s",a);
			for(register int h=0;h<m;h++) mapi[i][h+1]=a[h]-48;
		}
		for(register int i=n;i>=1;i--){
			for(register int h=m;h>=1;h--){
				if(mapi[i][h]) f[i][h]=0;
				else f[i][h]=f[i][h+1]+1;
			}
		}
		for(register int i=n;i>=1;i--){
			for(register int h=m;h>=1;h--){
				if(mapi[i][h]) f1[i][h]=0;
				else f1[i][h]=f1[i+1][h]+1;
			}
		}
		for(register int i=1;i<=n-2;i++){
			for(register int h=1;h<=m-1;h++){
				if(f[i][h]>0){
					for(register int k=i+1;!mapi[k][h]&&k<=n;k++){
						if(f[k][h]>1&&k>=i+2){
							ans+=f[i][h+1]*f[k][h+1];ans%=mo;
							ans1+=f[i][h+1]*f[k][h+1]*f1[k+1][h];ans1%=mo;
						}
					}
				}
			}
		}
		printf("%lld %lld\n",C*ans%mo,F*ans1%mo);
	}
	return 0;
}
2024/6/26 21:01
加载中...