#include<bits/stdc++.h> usingnamespace std; #define int long long constint N = 2e5 + 10; int n, m; int e[N][2], fa[N]; set<int> s; // s集合,保存每个连通块的根节点 vector<int> d; // 存储已经形成环的边的编号 vector<int> u, v, w; // 存储删除的边的信息
intfind(int x) { if(fa[x] != x) fa[x] = find(fa[x]); return fa[x]; } signedmain() { cin >> n >> m; //初始化并查集 for(int i = 1; i <= n; i++) fa[i] = i; for(int i = 1; i <= m; i++) { cin >> e[i][0] >> e[i][1];//读入边的两个端点 int x = find(e[i][0]), y = find(e[i][1]); if(x == y) d.push_back(i);//说明加上这条线之后可以成环 else fa[x] = y; } for(int i = 1; i <= n; i++) if(fa[i] == i) s.insert(i); //处理环 for(int i : d) { if(s.size() == 1) break; int p = *s.begin(), q = find(e[i][0]); if(p == q) p = *(++s.begin()); fa[q] = p; s.erase(s.find(q)); u.push_back(i); v.push_back(e[i][0]); w.push_back(p); } cout << u.size() << '\n'; for(int i = 0; i < u.size(); i++) { cout << u[i] << " " << v[i] << " " << w[i] << '\n'; } return0; }
constint MAXVAL = 1000000; // 假定数组中的最大值为 1000000 vector<int> A(N); // 存储 N 个元素的数组 A vector<int> freq(MAXVAL + 1, 0); // 频率数组,记录每个数字在 A 中出现的次数
// 读取数组 A 的元素,并更新频率数组 for (int i = 0; i < N; i++) { cin >> A[i]; // 读取第 i 个元素 freq[A[i]]++; // 增加频率计数 }
// 计算每个数 d 能整除多少个不同的数字 vector<int> cnt(MAXVAL + 1, 0); // cnt[d] 记录能够被 d 整除的数字在数组 A 中出现的次数 for (int d = 1; d <= MAXVAL; d++) { // 遍历 d 从 1 到 MAXVAL for (int m = d; m <= MAXVAL; m += d) { // 遍历 d 的倍数 m (m = d, 2d, 3d, ...) cnt[d] += freq[m]; // 对于每个 m,累加 freq[m],即 m 在 A 中的出现次数 } }
// 找到每个数字的最佳整除因子 vector<int> best(MAXVAL + 1, 0); // best[x] 记录数字 x 最佳的整除因子 for (int d = MAXVAL; d >= 1; d--) { // 从大到小遍历 d,找到最大 d if (cnt[d] >= K) { // 如果能整除至少 K 个数字 for (int x = d; x <= MAXVAL; x += d) { // 遍历所有能被 d 整除的数字 x (x = d, 2d, 3d, ...) if (best[x] == 0) { // 如果 x 还没有被赋值最佳因子 best[x] = d; // 将最佳因子 d 赋值给 x } } } }
// 输出每个数字的最佳因子 for (int i = 0; i < N; i++) { cout << best[A[i]] << "\n"; // 输出数组 A 中每个元素的最佳整除因子 }