題目鏈接
思路
- 當 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;
}