思路
- 当 m = 1 m=1 m=1时
发现是 M M M是一条 0 0 0的纵列,最后结果是 0 0 0
其余构造方法大体为:每行把上一行第一位元素移到队尾
- 当 n < = m − 1 n<=m-1 n<=m−1时
我们可以如下构造
0,1,2,3,4…m-1
1,2,3,4…m-1,0
2,3,4…m-1,0,1
…
n-2,n-1…m-1,0,1,2…n-3
找规律发现,
M
[
i
,
j
]
=
(
i
+
j
)
m
o
d
m
M[i,j]=(i+j)modm
M[i,j]=(i+j)modm
- 当 n > m − 1 n>m-1 n>m−1时
我们可以如下构造
0,1,2,3,4…m-1
1,2,3,4…m-1,0
2,3,4…m-1,0,1
…
m-2,m-1,0,1…m-3
发现
M
[
i
,
j
]
=
(
i
+
j
)
m
o
d
m
M[i,j]=(i+j)modm
M[i,j]=(i+j)modm,而行数没有打印完,按剩余的行数把上面的抄下来就行了
ACcode
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n, m;cin >> n >> m;
if (m == 1)cout << 0 << '\n';
else if (n > m - 1)cout << m << '\n';
else cout << n + 1 << '\n';
for (int i = 0;i < min(n, m - 1);i++) {
for (int j = 0;j < m;j++) {
cout << (i + j) % m << ' ';
}
cout << '\n';
}
if (n > m - 1) {
for (int i = m - 1;i < n;i++) {
for (int j = 0;j < m;j++) {
cout << j << ' ';
}
cout << '\n';
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}