筛法求Onm出lcm,然后二维单调队列。
细节看代码就懂了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int M = 5000+7;
int a[M][M],b[M][M],q[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,sz;
scanf("%d%d%d",&n,&m,&sz);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!b[i][j])
{
for(int k=1;k*i<=n&&j*k<=m;k++)
b[i*k][j*k]=k,a[i*k][j*k]=i*j*k;//类比找1-n因子
}
for(int i=1;i<=n;i++)//找每行 连续k列 的最大值。 存到b数组里
{
int l=1,r=1;
q[1]=0;
//memset(q,0,sizeof(q));
for(int j=1;j<=m;j++)
{
while(l<=r&&j-q[l]+1>sz)l++;
while(l<=r&&a[i][q[r]]<=a[i][j])r--;
q[++r]=j;
b[i][j]=a[i][q[l]];
}
}
for(int j=1