题目链接
思路
- 当 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;
}