1 条题解
-
0
题意简述
有一张 个点的无向图,顶点 之间有边当且仅当 是质数。求图的最小染色数及方案。
性质分析
两个数的 XOR 为奇数当且仅当它们奇偶性不同,为偶数当且仅当奇偶性相同。
除 以外的质数都是奇数,因此仅考虑奇质数时,图是一个二分图(奇偶分层)。
但偶质数 会产生边,例如 , 等,这些边的两端奇偶性相同且相差 。最小颜色数
- 时,显然 种颜色。
- 时, 和 之间有边(),需要 种颜色。
- 时, 和 之间无边,可以用 种颜色(如 )。
- 时,需要 种颜色。
- 时,需要 种颜色。
- 时,最少需要 种颜色。
构造方案()
使用 种颜色,按顶点编号模 的余数染色:。
证明:
若两个顶点同色,则它们的编号模 同余,因此它们的 XOR 是 的倍数。
唯一的偶质数是 ,但不能被 整除;奇质数不可能被 整除。
因此同色顶点之间的 XOR 不可能是质数,即不存在同色边。该染色合法。对于 ,可以直接使用预构造的最优方案。
复杂度
对于每组数据,输出 个整数。总复杂度 ,非常快。
参考代码
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; if (n == 1) { cout << "1\n1\n"; } else if (n == 2) { cout << "2\n1 2\n"; } else if (n == 3) { cout << "2\n1 2 2\n"; } else if (n == 4) { cout << "3\n1 2 2 3\n"; } else if (n == 5) { cout << "3\n1 2 2 3 3\n"; } else { // n >= 6,总是 4 色,按 mod 4 染色 cout << "4\n"; for (int i = 1; i <= n; ++i) { int c = (i - 1) % 4 + 1; cout << c << " \n"[i == n]; } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) solve(); return 0; }
- 1
信息
- ID
- 6820
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者