Solution
首先,有一个贪心思想:选择行被
h
h
h整除,列被
w
w
w整除的点作为关键点,值为负数,其他点全是正数
设关键点的点权为
x
x
x,其他点为
y
y
y
那么,有
x
+
y
(
h
w
−
1
)
<
0
x+y(hw-1)<0
x+y(hw−1)<0
所以,
x
=
(
1
−
h
w
)
y
−
e
p
s
x=(1-hw)y-eps
x=(1−hw)y−eps
e
p
s
eps
eps越小越好,但是因为题目中的限制:每个点必须在
−
1
0
9
-10^9
−109与
1
0
9
10^9
109之间,所以
e
p
s
eps
eps最多能取
500
∗
500
1
0
9
\frac{500*500}{10^9}
109500∗500
我代码中取的是
1000
1000
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]);
}