Solution
首先,有一个贪心思想:选择行被 h整除,列被 w整除的点作为关键点,值为负数,其他点全是正数
设关键点的点权为 x,其他点为 y
那么,有 x+y(hw−1)<0
所以, x=(1−hw)y−eps
eps越小越好,但是因为题目中的限制:每个点必须在 −109与 109之间,所以 eps最多能取 109500∗500
我代码中取的是 1000
Code
#include<bits/stdc++.h>
using namespace std;
int n,m,h,w,a[502][502],v,i,j;
long long sum;
int main(){
scanf("%d%d%d%d",&n,&m,&h,&w),v=(1-h*w)*1000-1;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) a[i][j]=(i%h==0 && j%w==0?v:1000),sum+=a[i][j];
if (sum<=0) return puts("No"),0;
puts("Yes");
for (i=1;i<=n;i++,puts(""))
for (j=1;j<=m;j++) printf("%d ",a[i][j]);
}