题解:CF2094F Trulimero Trulicina

· · 题解

模拟题。

首先如果 m 不被 k 整除,那么显然可以将 1\sim k 按从左到右、从上到下的顺序放进我们需构造的二维数组中,然后一直循环重复这样的操作即可。

如果 mk 整除,那么对于行号为奇数的行,将 1\sim k 按顺序放入该行即可;对于行号为偶数的行,考虑将 123456 等交换位置,注意特判 k 为奇数的情况,当 k 为奇数时将最后三个数 k-2,k-1,k 互换位置即可。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int a[N], b[N];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        int n, m, k;
        cin >> n >> m >> k;
        int now = 1;
        if (m % k == 0) {
            if (k % 2 == 0)
                for (int i = 1; i <= k; i += 2)
                    b[i] = i + 1, b[i + 1] = i;
            else {
                for (int i = 1; i <= k - 3; i += 2)
                    b[i] = i + 1, b[i + 1] = i;
                b[k - 2] = k - 1, b[k - 1] = k, b[k] = k - 2;
            }
            for (int i = 1; i <= n; i++) {
                if (i % 2 == 1)
                    for (int j = 1; j <= m; j++) {
                        if (j % k == 0)
                            cout << k;
                        else
                            cout << j % k;
                        cout << " ";
                    } else {
                    for (int j = 1; j <= m; j++) {
                        if (j % k == 0)
                            cout << b[k];
                        else
                            cout << b[j % k];
                        cout << " ";
                    }
                }
                cout << "\n";
            }
            continue;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cout << now << " ";
                now++;
                if (now > k)
                    now -= k;
            }
            cout << "\n";
        }
    }
}