题目
题意:给定
n
,
k
n,k
n,k。问能否构造一个
n
∗
k
n*k
n∗k的二维数组,使得
二维数组中,1到
n
∗
k
n*k
n∗k每个元素都用到;
对于每一行数,任意区间和能被它的区间长度整除,即
∑
j
=
l
r
a
i
j
%
(
r
−
l
+
1
)
=
=
0
,
1
<
=
i
<
=
n
,
1
<
=
l
<
=
r
<
=
k
\sum_{j=l}^ra_{ij}\%(r-l+1)==0,1<=i<=n,1<=l<=r<=k
∑j=lraij%(r−l+1)==0,1<=i<=n,1<=l<=r<=k。
如果不能构造,输出NO;否则输出YES,以及对应的二维数组。
思路:对于二维数组的每一行,构造序列
x
,
x
+
2
,
.
.
.
,
x
+
2
∗
(
k
−
1
)
x,x+2,...,x+2*(k-1)
x,x+2,...,x+2∗(k−1)。这是一个等差序列。
那么对于任意的子区间
0
<
=
l
,
r
<
k
0<=l,r<k
0<=l,r<k,其总和为
(
a
l
+
a
r
)
∗
(
r
−
l
+
1
)
/
2
=
(
x
+
2
∗
l
+
x
+
2
∗
r
)
∗
(
r
−
l
+
1
)
/
2
=
(
x
+
l
+
r
)
∗
(
r
−
l
+
1
)
(a_l+a_r)*(r-l+1)/2=(x+2*l+x+2*r)*(r-l+1)/2=(x+l+r)*(r-l+1)
(al+ar)∗(r−l+1)/2=(x+2∗l+x+2∗r)∗(r−l+1)/2=(x+l+r)∗(r−l+1),显然,
(
x
+
l
+
r
)
∗
(
r
−
l
+
1
)
(x+l+r)*(r-l+1)
(x+l+r)∗(r−l+1)能被区间长度
r
−
l
+
1
r-l+1
r−l+1整除。
通过以上思路,我们可以发现,每一行的元素,奇偶性要相同。因此,如果有奇数行,且列数超过1时(n为奇数,k>1),无法保证每一行的奇偶性相同,此时无法构造。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200010;
int n, k;
void solve() {
scanf("%d%d", &n, &k);
if ((n & 1) && k > 1) {
printf("NO\n");
return;
}
printf("YES\n");
int odd = 1, even = 2;
for (int i = 1; i <= n; ++i) {
int num = k;
if (i & 1) {
while (num--) {
printf("%d ", odd);
odd += 2;
}
} else {
while (num--) {
printf("%d ", even);
even += 2;
}
}
printf("\n");
}
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
solve();
}
return 0;
}
/*
2 4 6 8 10 12
*/