感觉没什么问题+三个阳历全过,但是3pts,求条玄关
查看原帖
感觉没什么问题+三个阳历全过,但是3pts,求条玄关
889917
limingyuan333楼主2024/10/3 21:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
int n,m;
int a[1010][1010];
int pre[1010][1010];
int pre2[1010][1010];
int T,id;
void init(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			pre[i][j]=pre2[i][j]=a[i][j]=0;
		}
	}
}
signed main(){
	cin>>T>>id;
	while(T--){
		int f,c;
		cin>>n>>m>>c>>f;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				char c;cin>>c;
				a[i][j]=c-'0';
				pre[i][j]=pre[i][j-1]+a[i][j];
				pre2[j][i]=pre2[j][i-1]+a[i][j];
			}
		}
		int ans=0,num=0;
		for(int i=1;i<=m;i++){
			int l=1,r=1;
			while(l<=n){
				if(r==n){
					++l;
				}
				else if(a[r+1][i]==0){
					++r;
				}
				else {
					if(r==l){
						l+=2,r+=2;continue;
					}
					l++;					
				}
				if(r-l>=2){
					int x=lower_bound(pre[l]+i+1,pre[l]+m+1,pre[l][i]+1)-pre[l];
					int y=lower_bound(pre[r]+i+1,pre[r]+m+1,pre[r][i]+1)-pre[r];
					int z=lower_bound(pre2[i]+r+1,pre2[i]+n+1,pre2[i][r]+1)-pre2[i];
					ans=(ans+(x-i-1)*(y-i-1)%mod)%mod;				
					num=(num+(x-i-1)*(y-i-1)*(z-r-1)%mod)%mod;
				}
			}
		}
		init();
		cout<<ans*c<<" "<<num*f<<'\n';
	}	
	return 0;
}
2024/10/3 21:38
加载中...