这是牛客多校第六场的G题,也是我第一篇关于牛客多校的博客。
这道题题目意思是给你一个n*n的细胞块,让我们通过给每一块的边缘绘色,让他满足以下三个条件:
(1)满足每种颜色的颜色数量相同;
(2)满足每一块不能全部用一个色绘边;
(3)满足同一行或者同一列要2种颜色以上;
题目给我们t组测试样例,然后给我们n和k种颜色。
大致分析一下可以得出以下结论:
(1)边的数量要是k的整数倍;
(2)n和k不能为1。
然后我们开始构造:
我们只需要保证同行 / 列没有两条相邻的边,且相邻两行 / 列同一列 / 行的边颜色不相同。
这是很好构造的,对于 ,直接按 顺序依次分配边权;对于 ,在偶数行 / 列上循环移 1 位即可。
然后附上AC代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #define ll long long using namespace std; long long pow_mod(long long a, long long k,long long mod) { long long ans = 1; a %= mod; while (k) { if (k % 2) ans *= a; a = (a * a) % mod; k /= 2; ans %= mod; } return ans; } int main() { int t; cin >> t; while (t--) { int n, k; cin >> n>>k; if ((2 *n* (n + 1)) % k != 0||n==1||k==1) { cout << "-1" << endl; } else { if (n % k == 0) { int lazy = 0; for (int i = 1; i <= 2 * (n + 1); i++) { int flag = lazy; for (int j = 1; j <= n; j++) { flag = flag % k + 1; printf("%d", flag); if (j == n)printf(" "); else printf(" "); } lazy ^= 1; } } else { int lazy = 0; for (int i = 1; i <= 2 * (n + 1); i++) { for (int j = 1; j <= n; j++) { lazy = lazy % k + 1; printf("%d", lazy); if (j == n)printf(" "); else printf(" "); } } } } } }