列表

详情


NC231411. 矩阵矩阵矩

描述

你有一个  的矩阵 a 为 0 或   。

你要在里面切割一个子矩阵,使得其  的乘积最大,输出乘积对 998244353 取模的结果。    

形式化地,你要求得:




输入描述

第一行两个整数 n,m 分别为矩阵的行数和列数。

接下来 n 行,每行 m 个整数为  。


输出描述

输出一行,一个整数,为答案。

示例1

输入:

8 8
4 4 0 1 0 1 1 1 
1 2 1 0 8 1 4 1 
1 1 2 0 1 1 1 4 
0 1 1 0 1 0 4 0 
1 0 0 1 1 1 0 1 
1 0 1 4 4 1 8 0 
1 1 8 4 4 0 0 0 
4 4 2 8 1 0 0 1

输出:

32768

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 1019ms, 内存消耗: 243068K, 提交时间: 2021-12-18 20:46:07

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int mod=998244353;
int maxn=1005;
int maxm=30000005;
int inf=1e8;
int n,m;
long long a[30000005];
long long b[1005][1005];
int main()
{
	a[0]=1;
	for(int i=1;i<=maxm;i++) a[i]=(a[i-1]*2)%mod; 
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			int x;
			scanf("%d",&x);
			if(x==0) b[i][j]=-inf;
			else while(x!=1) x/=2,b[i][j]++;
			b[i][j]+=b[i-1][j];
		}
	long long ans=0;
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
		{
			long long now=0;
			for(int k=1;k<=m;k++)
			{
				now=max(b[j][k]-b[i-1][k],now+b[j][k]-b[i-1][k]);
				ans=max(ans,now);
			}
		}
	if(ans<=0) printf("0");
	else printf("%lld",a[ans]);
	return 0;
}

上一题