当前位置: 首页 > news >正文

【补题】ACPC Kickoff 2025 F. Kinan The Bank Robber

题意:给出长度为n的序列,接下来给出了两个包裹,你可以选择把数字放进这两个包裹当中,要求你放的的方式,最终会让包裹内的数字双双互质,请你给出你的放法,如果没有输出-1

思路:

1.包裹内数字双双互质,其实也就是一个包裹当中,质因数只能出现一次,因数太多了不讨论,枚举一定n方,讨论gcd只看质因数是常见手段了。

2.两个包裹,并且要求所有的数都要放入,如果贪心的想,那其实就是没有相同质因数放一起就行了,但是
5
6 15 77 35 143
就hack了,答案为1 2 2 1 1,如果你也是走上了贪心的歪路,看一下这个样例就知道了

3.贪心不行,又要讨论可行的分组,分两组,其实就是二分图染色!对于每个点有相同质因数的点染上相反的颜色就行了。

代码:     对于一些好的用法进行了注释,值得学习的方法。

#include <bits/stdc++.h>
#define int long long
#define int128 __int128
#define IOS                                                                                                            \std::ios::sync_with_stdio(0);                                                                                      \std::cin.tie(0);                                                                                                   \std::cout.tie(0);
const int N = 1e7 + 10;
const int INF = 1e18;
const int MOD = 998244353;int MinP[N];void init() {for(int i = 2; i <= N; i++) {if(MinP[i] == 0) {MinP[i] = i;for(int j = i * 2; j <= N; j += i) {if(!MinP[j])MinP[j] = i;}}}
}void solve() {int n;std::cin >> n;std::vector<int> ve(n);for(int i = 0; i < n; i++) {std::cin >> ve[i];}std::vector<std::vector<int>> mp(n);std::map<int, std::vector<int>> pos;for(int i = 0; i < n; i++) {int x = ve[i];while(x > 1) {int p = MinP[x];         //MinP预处理每个数的最小质因数pos[p].push_back(i);     //分解质因数,这种该方式分解质因数是log(x)while(x % p == 0)x /= p;}}for(auto& kv : pos) {auto& v = kv.second;     //v相当于直接对kv.second操作,引用if(v.size() >= 3) {std::cout << -1 << '\n';    //3个相同质因数肯定不行return;} else if(v.size() > 1) {mp[v[0]].push_back(v[1]);mp[v[1]].push_back(v[0]);    //存边}}std::vector<int> col(n, -1);std::queue<int> q;for(int i = 0; i < n; i++) {    //BFS染色if(col[i] != -1)continue;q.push(i);col[i] = 0;while(q.size()) {auto t = q.front();q.pop();for(auto u : mp[t]) {if(col[u] == -1) {col[u] = col[t] ^ 1;q.push(u);} else if(col[u] == col[t]) {std::cout << -1 << '\n';return;}}}}for(int i = 0; i < n; i++)std::cout << (col[i] == 0 ? 1 : 2) << " \n"[i == n - 1];//" \n"[i == n - 1]代表i==n-1的时候是换行,其他时候都输出" "
}signed main() {IOS;init();int t = 1;// std::cin >> t;while(t--) {solve();}
}

http://www.xdnf.cn/news/199549.html

相关文章:

  • tensor 的计算操作
  • C#核心知识
  • Allegro23.1新功能之如何解冻动态铜皮操作指导
  • Druid监控sql导致的内存溢出
  • [Windows] MousePlus 5.5.9
  • 盈飞无限再出重磅新品 AI版质量智能双星璀璨
  • QML文件中如何创建QML对象并打开
  • 机器学习day3 - KNN的api调用
  • Vue3 项目中 Pinia 与 JavaScript 循环依赖问题深度解析
  • 三小时快速上手TypeScript之接口
  • SoapUi测试1——REST(WebAPi、Json协议/HTTP、Post通讯方式)接口测试
  • 【AI 工业应用 】AI大模型在工业领域(CAD等)的前景与实战
  • 1.8空间几何与场论
  • OpenGL进阶系列21 - OpenGL SuperBible - blendmatrix 例子学习
  • [26] cuda 应用之 nppi 实现图像格式转换
  • 企业 AD 域安全10大风险场景解析
  • Redis常用数据结构解析:从原理到实战应用
  • Python(14)推导式
  • Linux文件的一般权限
  • 2799. 统计完全子数组的数目
  • [Spring] Sentinel详解
  • Linux常见基础命令
  • i/o复用函数的使用——epoll
  • jclasslib 与 BinEd 结合的二进制分析技术指南
  • 【计算机系统结构】第四章
  • 利用EMQX实现单片机和PyQt的数据MQTT互联
  • 数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记6
  • 计算机基础—(九道题)
  • 云上玩转DeepSeek系列之六:DeepSeek云端加速版发布,具备超高推理性能
  • AI图片跳舞生成视频,animate X本地部署。