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

CF1762D GCD Queries - Rye

题意

交互题,多组测试数据。

给定一个隐藏的长为 \(n\)\(0-n\) 排列 \(p\),每次询问可以考虑一下两种操作之一:

  • ? x y:询问该排列第 \(x\) 个数和第 \(y\) 个数的最大公约数,即 \(gcd(p_x,p_y)\)

  • ! x y:回答该排列第 \(x\) 个数和第 \(y\) 个数之中有一个为 \(0\)

规定 \(gcd(0,x) = gcd(x,0) = 0\),询问次数不得超过 \(2*n\) 次。

解法

说实话听巧妙的,一道思维好题。

没有思考过的读者可以试着动动脑筋,蛮有意思的。

由于题目限制询问次数为 \(2*n\),可以合理猜想每两次询问就能得到什么信息;而又因为需要回答有关 \(0\) 的位置,猜到每两次询问可以确定一位不是零(很显然因为如果确定一位是零就没什么可做的了)。

又注意到最终的回答为两个数中的一个为 \(0\),联想到询问的策略在每次一起询问的集合大小小于等于二时就无效了。

那么考虑每次拎出还没有被判定的三个数 \(p_i\)\(p_j\)\(p_k\),观察他们两两 \(gcd\) 与零的位置的关系,可以发现:

  • \(gcd(p_i,p_j) = gcd(p_i,p_k)\),则 \(p_i\) 一定不为零。因为序列 \(p\) 是一个排列,而题目规定任何数与 \(0\)\(gcd\) 为其本身,所以在 \(p_i\) 为零的情况下不可能出现两个数与其 \(gcd\) 的值相同。

  • \(gcd(p_i,p_j) > gcd(p_i,p_k)\),则 \(p_k\) 一定不为零。可以假设如果 \(p_k\) 为零,那么很显然有 \(gcd(p_i,p_k)\) 值为 \(p_i\);然而由于 \(p_k\) 已经等于零,\(p_j\) 就不可能等于零,那么 \(p_i\) 与一个不为零的数的 \(gcd\) 很显然小于其本身。

  • \(gcd(p_i,p_j) < gcd(p_i,p_k)\),则 \(p_j\) 一定不为零。与上一条是相似的,请读者自己思考。

根据这三个性质,就可以询问次数 \(2*(n-2)\) 次处理问题了。考虑维护三个指针,每次判定完一个数之后右移,则时间复杂度为 \(O(n)\)\(n \leq 20000\),且询问组数 \(t \leq 10000\),总时间复杂度 \(O(t*n)\),可以通过本题。

\(Code\)

#include<bits/stdc++.h>
using namespace std;
int tag[20005];
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){int n,i=1,j=2,k=3,cnt=0;cin>>n;if(n==2){cout<<"! 1 2"<<endl;int flag;cin>>flag;if(flag==-1) return 0;continue;}for(int i=1;i<=n;i++) tag[i]=0;while(cnt!=n-2){for(;i<=n;i++)if(tag[i]==0) break;for(;j<=n;j++)if(tag[j]==0&&i!=j) break;for(;k<=n;k++)if(tag[k]==0&&i!=k&&j!=k) break;int gcd1,gcd2;cout<<"? "<<i<<" "<<j<<endl;cin>>gcd1;cout<<"? "<<i<<" "<<k<<endl;cin>>gcd2;if(gcd1==gcd2) tag[i]=1;else if(gcd1>gcd2) tag[k]=1;else tag[j]=1;cnt++;}int ans1,ans2;for(ans1=1;ans1<=n;ans1++)if(tag[ans1]==0) break;for(ans2=ans1+1;ans2<=n;ans2++)if(tag[ans2]==0) break;cout<<"! "<<ans1<<" "<<ans2<<endl;int flag;cin>>flag;if(flag==-1) return 0;}return 0;
}

码风过丑,勿喷。

http://www.jsqmd.com/news/593591/

相关文章:

  • 【网络安全实战入门】从零到一:在VMware上部署Kali Linux 2022全流程解析
  • 计算机毕业设计:Python地铁运营全维度数据可视化与后台管理系统 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅
  • OpenClaw、Agent、Skill、MCP 深度解读与区分分析
  • 第三期漫画周报
  • 实验二 C语言分支与循环基础应用编程
  • 2026年花洒产品推荐:花洒哪个品牌好?4款热门花洒排行榜
  • Linux下WRF-Chem Intel编译器实战:从环境配置到编译成功的避坑指南
  • 高效使用Ultimaker Cura:从入门到精通的3D打印切片工作流
  • 非华为电脑也能用上鸿蒙生态?手把手教你给Win10/Win11装上最新华为电脑管家(附移动应用引擎开启方法)
  • 告别printk:用Linux内核Tracepoint给你的驱动调试换个活法(附ext4实战代码)
  • AI元人文:自感痕迹论——工夫与功夫的再辩证
  • 04 月 05 日 AI 每日参考:谷歌 Gemma 4 开源 国产 AI 算力生态强势崛起
  • EC11编码器硬件设计避坑指南:上拉电阻选择与PCB布局要点
  • 基于Quartus平台的RISCV五级流水线CPU设计与验证
  • Gym - 100624D Non-boring sequences
  • MDIN380芯片高清视频处理方案:SDI转VGA与LVDS转换,专业PCB设计与源码集成
  • olonCode v0.0.20 发布 - 编程智能体(新增子代理和浏览器能力)
  • [T.2] 团队项目:选题和需求分析
  • Scratch二次开发实战:如何按需“阉割”菜单栏功能?从关闭语言切换、主题到隐藏教程按钮
  • 当openclaw安装报错时:如何用快马ai模型快速诊断与生成修复方案
  • 可伴臻选购物卡回收方式 - 京顺回收
  • AI时代程序员必看!揭秘Harness Engineerin
  • 对接亚马逊 SP-API(Amazon Selling Partner API) 第一章:AWS IAM 配置详解
  • 记录生活中的一件小事(佚名整理)
  • 无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV
  • AI辅助开发新体验:打造智能链接内容分析与摘要生成工具
  • 从频谱仪读数到测试报告:深入理解dBμV/m、dBm这些单位在EMC辐射发射测试中的真实含义
  • OpenClaw家庭应用:Qwen3-32B管理智能家居设备控制脚本
  • 2026 最新全开源壁纸头像小程序源码:自带流量主,完美适配微信生态
  • 2025Reddit养号实战:3步打造高Karma账号矩阵