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

P9345 夕阳西下几时回 解题报告

题目传送门

众所周知一篇题解需要一个头图。

题目大意

构造一个仅由 \(1\sim n\) 组成的长度为 \(n\) 的排列,使得相邻两项的 \(\gcd\)\(k\) 种不同的数(乡愁度)

解题思路

前置知识:如果两个数有倍数关系,那么这两个数的 \(\gcd\) 是那个较小的数,即 \(\gcd(x,kx)=x\)\(k\)\(x\) 均为整数)。

首先考虑最大的 \(\gcd\) 的种类(乡愁度)有多少种:

一个每相邻两项之间都有倍数关系的长度为 \(i\) 的排列它的乡愁度贡献为 \(i-1\)(每相邻两项之间都是一个新的 \(\gcd\)),那么我们考虑将 \(1\sim n\) 的排列分成若干个这种排列,设这个倍数关系为 \(k\) 倍,则可知从 \(1\) 开始排列的那个排列最长,其他排列成比例减少,这个最长排列为:

\[1,k,k^2,k^3,k^4 \dots \]

一直到 \(k^i>n\) 时排列终止,排列长度为 \(\left \lfloor \log _k n \right \rfloor +1\)

由此可知当且仅当 \(k=2\) 时排列最长,此时 \(1\sim n\) 分成的排列也最少,答案也就会越大。

此时从小到大每次选取没被排列过的数为首每次 \(\times 2\),得到的排列即为乡愁度最大的排列,如果这个排列的乡愁度为 \(ans\),那么当 \(k>ans\) 时无解。

考虑 \(k<ans\) 的情况:

当按照如上方式从 \(1\sim n\) 中取出排列并记录此时答案,当此时答案达到 \(k\) 时把剩下的数从小到大排列,每两个数之间的 \(\gcd\) 一定为 \(1\),证明如下:

  1. 当取第一个(首项为 \(1\),公比为 \(2\))排列之前,剩余的数均相邻,由 \(\gcd(i,i+1)=1\) 得,剩下的数相邻两项的 \(\gcd\) 一定为 \(1\)

  2. 当取第一个(首项为 \(1\),公比为 \(2\))排列之后,剩余的数均为奇数,剩余的相邻两项之间差值为若干个 \(2\),且后一个数不会是前一个数的倍数(前一个数最小为 \(3\),它和它的最近倍数 \(9\) 之间存在质数,而质数只能当排列的第一个数,此时前一个数已经被取走,不会是剩余的数),则相邻两项的 \(\gcd\) 也是 \(1\)

则将剩下的数从小到大排列输出不会对答案产生影响,所以当答案达到 \(k\) 时结束并将剩余的数输出就能保证答案为 \(k\)

AC Code

防止作弊只放主函数:

signed main()
{T=re();while(T--){n=re(),k=re(),ans=0;for(int i=1;i<=n;i++)//初始化好习惯 vis[i]=0;//vis数组存这个数在没在排列中出现过 for(int i=1;i<=n;i++)//先求最大ans {if(!vis[i]){for(int temp=i;temp<=n;temp*=2)vis[temp]=1,ans+=(temp!=i);}}if(k>ans)//判断无解情况 puts("No");else{ans=0;for(int i=1;i<=n;i++)//初始化好习惯*2 vis[i]=0;puts("Yes");for(int i=1;i<=n;i++){if(!vis[i]){if(ans==k)//按照那个方法排列直到ans=k break;for(int temp=i;temp<=n;temp*=2){wr(temp),putchar(' '),vis[temp]=1,ans+=(temp!=i);if(ans==k)break;}}}for(int i=1;i<=n;i++)//将剩下的数从小到大输出 if(!vis[i])wr(i),putchar(' ');putchar('\n');}}return 0;
}
http://www.jsqmd.com/news/88396/

相关文章:

  • 专网自实现域名系统的深度可行性研究与实施规划报告
  • 本地部署开源可视化界面开发工具 Node-RED 并实现外部访问( Linux 版本)
  • 实习面试题-ZooKeeper 原理面试题
  • T321484 刁钻的客人 私题题解
  • CF1891B Deja Vu 解题报告
  • 本地部署开源可视化界面开发工具 Node-RED 并实现外部访问( Windows 版本)
  • U249090 密码门 私题题解
  • 2025企业AI部署革命:T-pro-it-2.0-GGUF如何让本地化门槛直降60%?
  • JSP如何实现大文件分片上传与多线程上传?
  • 三相共直流母线式光储VSG/虚拟同步机逆变器模型仿真:离散化快速运行与前级PV最大功率追踪控制
  • Sed 例程大全
  • 【Vue3】 中 ref 与 reactive:状态与模型的深入理解
  • 实习面试题-Zookeeper 面试题
  • 双机并联虚拟同步发电机仿真模型:均分负载与优质波形输出,可拓展自适应与光伏储能技术
  • 清除企业不良记录的通知
  • Grep 例程大全
  • python环境及pip的操作
  • 管理Linux的联网
  • HTTP协议在JSP大附件上传中如何优化性能?
  • 网页前端如何通过JSP实现大文件秒传功能?
  • Ursa.Avalonia样式系统终极指南:5大技巧助你构建企业级UI
  • Asio应用(高级):构建高性能、安全、跨平台的网络系统
  • 实习面试题-Spark SQL 面试题
  • CF958A1 Death Stars (easy) 解题报告
  • PS 例程大全
  • wangEditor导入excel数据到html富文本编辑
  • 如何利用JSP实现信创环境的大文件上传?
  • 实习面试题-Kotlin 面试题
  • CF1619G Unusual Minesweeper 解题报告
  • 毕设 stm32 RFID员工打卡门禁系统(源码+硬件+论文)