H. GCD is Greater

H. GCD is Greater

题意

  给定一个长度为 n n n的数组 a a a,先手选择 [ 2 , n − 2 ] [2,n-2] [2,n2]个数并计算所选择数的gcd,后手选择剩下的数,并计算剩下所有的数按位与的结果,再加上给定的 x x x,如果先手的结果大于后手,则先手赢,否则后手赢。找出先手必胜的方案,或输出先手不可能获胜。

分析

  首先贪心地想到,若想gcd大,选择的数的数量越小越好,即只选择两个数,因为再选择别的数gcd不会再增加,而不会让结果更优。
  再考虑到后手的计算过程为剩下的数按位与,那么考虑每一位的最终结果,统计每一位在数组中出现了多少次。对于每一位,此时有三种可能,令先手选择的两个数的下标为 x 1 x_{1} x1 x 2 x_{2} x2

  • x 1 x_{1} x1 x 2 x_{2} x2中有一个数在该位为1
  • x 1 x_{1} x1 x 2 x_{2} x2在该位的值都是1
  • x 1 x_{1} x1 x 2 x_{2} x2在该位的值都是0

对于上述三种情况,当该位为 1 1 1的数量 − ( x 1 -(x_{1} (x1 x 2 x_{2} x2在该位为 1 1 1的数量 ) = n − 2 )=n-2 )=n2,则后手计算的结果中这一位必定是 1 1 1,否则必定是 0 0 0,那么我们可以找到这些特殊点,即该位为 1 1 1的数量为 n n n n − 1 n-1 n1 n − 2 n-2 n2时, a i a_{i} ai在该位非 1 1 1,那么当我们选或不选它们对结果是有影响的。该集合大小为 2 l o g ( m a x ( a i ) ) 2log(max(a_{i})) 2log(max(ai))。然后考虑除了上述情况的其他情况,根据贪心想法,肯定是gcd越大越好,那么我们可以存下每个数以及其约数出现次数的和,然后从大到小枚举gcd的大小,暴力判断即可,只需要判断能取到的最大gcd即可,其他的必然不会比最大的更优。
  对于会影响按位与的数,固定一个有影响的数,然后枚举另一个数,再暴力判断是否符合条件即可,时间复杂度 O ( n ( ( l o g ( m a x a i ) ) 2 + l o g ( m a x a i ) l o g V ) ) O(n((log(maxa_{i}))^{2}+log(maxa_{i})logV)) O(n((log(maxai))2+log(maxai)logV)) l o g V logV logV为计算gcd的复杂度

AC代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
vector<int> p[400010];
void init() {for (int i = 1; i <= 400000; i++) {for (int j = i; j <= 400000; j += i) {p[j].emplace_back(i);}}
}
LL gcd(LL a, LL b) {return b == 0 ? a : gcd(b, a % b);
}
void Solve() {int n, x;cin >> n >> x;vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];}int maxx = *max_element(a.begin() + 1, a.end());int L = __lg(maxx);vector<int> cnt(L + 1);vector<int> cnt1(maxx + 1);vector<int> z;for (int i = 1; i <= n; i++) {for (int j = 0; j <= L; j++) {if (a[i] >> j & 1) {cnt[j]++;}}}vector<bool> vis(n + 1);for (int j = 0; j <= L; j++) {if (cnt[j] < n - 2) {continue;}for (int i = 1; i <= n; i++) {if (!(a[i] >> j & 1)) {z.emplace_back(i);vis[i] = true;}}}for (int i = 1; i <= n; i++) {if (!vis[i]) {int sz1 = p[a[i]].size();for (int j = 0; j < sz1; j++) {cnt1[p[a[i]][j]]++;}}}vector<int> q;for (int i = maxx; i >= 1; i--) {if (cnt1[i] < 2) {continue;}for (int j = 1; j <= n && q.size() < 2; j++) {if (a[j] % i == 0 && !vis[j]) {q.emplace_back(j);}}int g = gcd(a[q[0]], a[q[1]]);int sum = 0;for (int j = 0; j <= L; j++) {int num = 0;if (a[q[0]] >> j & 1) {num++;}if (a[q[1]] >> j & 1) {num++;}if (cnt[j] - num == n - 2) {sum |= (1 << j);}}if (sum + x < g) {cout << "YES\n";cout << "2 " << a[q[0]] << " " << a[q[1]] << '\n';cout << n - 2 << " ";for (int j = 1; j <= n; j++) {if (j != q[0] && j != q[1]) {cout << a[j] << " ";}}cout << '\n';return;}break;}sort(z.begin(), z.end());z.erase(unique(z.begin(), z.end()), z.end());int sz = z.size();for (int i = 0; i < sz; i++) {for (int j = 1; j <= n; j++) {if (z[i] == j) {continue;}int sum = 0;for (int k = 0; k <= L; k++) {int num = 0;if (a[j] >> k & 1) {num++;}if (a[z[i]] >> k & 1) {num++;}if (cnt[k] - num == n - 2) {sum |= (1 << k);}}int g = gcd(a[j], a[z[i]]);if (sum + x < g) {cout << "YES\n";cout << "2 " << a[j] << " " << a[z[i]] << '\n';cout << n - 2 << " ";for (int k = 1; k <= n; k++) {if (k != z[i] && k != j) {cout << a[k] << " ";}}cout << '\n';return;}}}cout << "NO\n";
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);init();int T;cin >> T;while (T--) {Solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Redis Debian服务器版

1.使用官方安装脚本自动安装docker 安装命令如下&#xff1a; curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh 如果安装提示 -bash sudo command not found 则需要 #update sudo apt-get update sudo apt-get install sudo再执行安装脚本1 安装…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

上采样-Lanczos插值

Lanczos插值是一种高级的上采样方法&#xff0c;它在计算目标图像中每个像素的值时&#xff0c;利用了周围像素的信息&#xff0c;并通过Lanczos滤波器进行插值计算&#xff0c;以产生较为清晰的结果。下面通过图文并茂的方式详细描述Lanczos插值方法的实现过程。 现在我们想将…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前&#xff08;idea默认字体为 JetBrains Mono&#xff09; 2.设置后&#xff08;楷体&#xff09;

计算机网络常见面试总结

文章目录 1. 计算机网络基础1.1 网络分层模型1. OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;2.TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;3. 为什么网络要分层&#xff1f; 1.2 常见网络协议1. 应用层有哪些常见的协议&#xff1f;2…

三种语言实现spark createDataFrame

前言 我们经常需要在本地用数组写一些测试数据,进行spark逻辑测试,需要借助StructType和StructField以及数组生成DataFrame,最终进行测试,这里就简单的用Java、Scala、Python三种语言实现用数组的数据创建DataFrame。 了解StructType和StructField StructType spark stru…

systemctl start docker报错(code=exited, status=1/FAILURE)

运行systemctl start docker报错内容如下: 输入systemctl status docker.service显示以下内容&#xff1a; 本次启动不起来与docker服务无关 具体解决问题是修改 /etc/docker/daemon.json&#xff0c;vim /etc/docker/daemon.json # 添加如下内容 {"registry-mirrors&qu…

ccf201509-3模板生成系统(list,map,字符串综合运用)

问题描述 成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&#xff0c;对于展示用户信息的页面&#xff0c;当用户为 Tom 时&#xff0c;网页的源代码是&#xff1a; 而当用户为 Jerry 时…

华为OD-C卷-分披萨[100分]

题目描述 "吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认…

使用htmlentities()和nl2br()将文本数据正确显示到前台

问题&#xff1a; 在后台textarea里编辑了有一串字符串&#xff0c;虽然在textarea里编辑是有换行效果的&#xff0c;但是数据获取到就只是\n&#xff0c;前端是不认识这个的&#xff0c;正确输出到前台的换行只能是<br/>。 $str "ABCDEFGHIJKLMNOPQ"; echo…

网络安全之反弹Shell

网络安全之反弹Shell 在网络安全和渗透测试领域&#xff0c;“正向Shell”&#xff08;Forward Shell&#xff09;和"反向Shell"&#xff08;Reverse Shell&#xff09;是两种常用的技术手段&#xff0c;用于建立远程访问目标计算机的会话。这两种技术都可以让攻击者…

Golang | Leetcode Golang题解之第22题括号生成

题目&#xff1a; 题解&#xff1a; var res []stringfunc generateParenthesis(n int) []string {res make([]string, 0)dfs(n, 0, 0, "")return res }func dfs(n int, lc int, rc int, path string) {if lc n && rc n {res append(res, path)return }…

2024-Java-Maven学习笔记

Maven Maven是一个Java项目管理和构建工具&#xff0c;作用&#xff1a;定义&#xff08;规范&#xff09;项目结构、项目依赖、使用统一的方式自动化构建&#xff08;clean、compile&#xff09;。 提供了一套依赖管理机制&#xff1a;利用仓库统一管理jar包&#xff0c;利用…

阿里云(国内)安装nvm

更多文章&#xff0c;访问&#xff1a;阿里云&#xff08;国内&#xff09;安装nvm – 夜空中最亮的星 直接使用nvm脚本安装的时候一直失败&#xff0c;应该是国内网络的问题&#xff0c;使用下面方案进行解决&#xff1a; 下载 cd / wget https://github.com/nvm-sh/nvm/arch…

机器学习-09-图像处理01-理论

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像处理技术。 参考 02图像知识 色彩基础知识整理-色相、饱和度、明度、色调 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&#xff09; Python图像处理入门 【人工智能】PythonOpenCV…

线程池-线程池分类

线程池分类 FixedThreadPool&#xff1a;固定大小线程池&#xff0c;线程数量固定&#xff0c;不会自动扩容或缩容。 CachedThreadPool&#xff1a;缓存线程池&#xff0c;线程数量不固定&#xff0c;根据需要自动扩容或缩容。适用于执行大量短时间任务的场景。 SingleThrea…

HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)

文章目录 HttpClient、OKhttp、RestTemplate接口调用对比HttpClientOkHttprestTemplate HttpClient、OKhttp、RestTemplate接口调用对比 HttpClient、OkHttp 和 RestTemplate 是三种常用的 Java HTTP 客户端库&#xff0c;它们都可以用于发送 HTTP 请求和接收 HTTP 响应&#…

微服务学习(黑马)

学习黑马的微服务课程的笔记 导学 微服务架构 认识微服务 SpringCloud spring.io/projects/spring-cloud/ 服务拆分和远程调用 根据订单id查询订单功能 存在的问题 硬编码 eureka注册中心 搭建eureka 服务注册 在order-service中完成服务拉取 Ribbon负载均衡 Nacos注册中心…

水利自动化控制系统平台介绍

水利自动化控制系统平台介绍 在当今社会&#xff0c;水资源的管理和保护日益成为全球关注的重要议题。随着科技的进步和信息化的发展&#xff0c;水利监测系统作为一种集成了现代信息技术、自动化控制技术以及环境监测技术的综合性平台&#xff0c;正在逐步改变传统的水利管理模…

快照技术的基本介绍

目录 一、概述 二、名词解释 三、镜像分离 四、COW 五、ROW 六、参考 一、概述 全球网络存储工业协会 SNIA&#xff08;Storage Networking Industry Association&#xff09;对快照&#xff08;Snapshot&#xff09;的定义是&#xff1a;关于指定数据集合的一个完全可用…