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

8.6 label

题目大意

给定整数 \(n\) ,要求构造一个序列 \(a\) ,满足如下条件。

  • 对于两个整数 \(i\) , \(j\) ,若 \(1 \le i<j \le n\) ,且 \(i\)\(j\) 的约数,那么 \(a_i \neq a_j\)

请输出 \(\max\{a_1,a_2,\dots,a_n\}\) 最小的序列。

数据范围

\(1 \le n \le 10^5\)

思路概述

因为一个数的颜色不能与其因子相同,所以考虑这样一种染色法:对于 \(1\) ,我们特殊地将其染色为 \(1\) ;而对于其他数,我们给它染上除了它自身的最大因子(这里不规范地暂且将其称为“次大因子”)的颜色加一

下面证明正确性。也就是要证明这个做法的答案最小性满足条件性

先证满足条件性。即证下面这个命题:对于一个数,它的次大因子的颜色不比更小的因子的颜色更小。将这个数进行质因数分解,那么每个它的因子肯定都是由这些质因数组成的,所以更大的因子肯定是更小的因子的倍数,那么就说明:更小的因子肯定是更大的因子的因子,那么最大的“更小因子”的颜色肯定是要小于次大因子的颜色的。那么这样递推下去,就能得到:次大因子的颜色不比更小的因子的颜色更小。

然后来证明答案最小性。这个性质也可以换一种说法,即答案密铺性(个人觉得这个说法挺形象的)。由于上面提到的规则, \(1\) 的颜色是 \(1\) ,那么就可以继续推得质数的颜色是 \(2\) ,那么也就可以推得 \(3\) , \(4\) , \(5\) 的颜色归属。这样,每个颜色都尽可能铺满了所有能被染色的位置,知道不能再铺了才到下一个颜色。所以答案一定是最小的。(但是个人觉得这个证明不太严谨,欢迎各位大佬指正)。

做法也很简单,众所周知,线性筛可以求出每个数的最小质因子。而容易证明,次大因子就是原数除以最小质因子。所以我们只需跑线性筛一遍(注意细节,参见下面代码),然后按上面的步骤就行。时间复杂度 \(O(n)\)

还有另一种做法,就是证明答案对于 \(2\) 的次幂有可划分性。那样就直接取 \(2\) 的对数就行,时间复杂度也是 \(O(n)\) ,但代码实现更简单,只是更难想到。具体证明过程等我请教完再补充,昨天讲的现在有点忘了……

代码示例

方法一:次大因数法

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m;
int val[N],prm[N];
int ans[N];
int main() {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n;for(int i=2;i<=n;i++) {if(!val[i]) {val[i]=i;prm[++m]=i;}for(int j=1;j<=m;j++)if((ll)prm[j]*i<=(ll)n) val[prm[j]*i]=prm[j];}for(int i=1;i<=n;i++) {if(i==1) {ans[i]=1;continue;}ans[i]=ans[i/val[i]]+1;}for(int i=1;i<=n;i++) cout<<ans[i]<<' ';return 0;
}

方法二:对数法

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
int lg[N];
int main() {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n;for(int i=1;i<=n;i++) {lg[i]=lg[i>>1]+1;cout<<lg[i]<<' ';}return 0;
}

这应该也是最详细的题解了吧

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

相关文章:

  • 上海全屋定制工厂店实地验证指南——设备、车间、报价的三维度判断 - 精彩城市
  • Brisk核心功能解析:双因素认证、附件上传与Radar保存技巧
  • 《Docker 容器化镜像安全管理 线上高并发排障实战》
  • 终极开源字体方案:如何用Montserrat打造3个免费的专业级设计
  • caj转pdf用哪个软件好?实测7款覆盖日常与学术场景的格式转换工具盘点 - 软件小管家
  • Mermaid Live Editor:零成本重塑你的图表创作体验,让想法秒变可视化
  • Scroll Reverser终极指南:解决macOS滚动方向混乱的完美方案
  • 5分钟上手ComfyUI:MiniMax-H3-GGUF工作流配置与优化技巧
  • 证件照换底色App怎么操作?这几款工具几分钟搞定 - 提词匠
  • Moirai-1.0-R-Base实战案例:用Python预测股票价格的完整流程
  • 7大开源数据集强强联合:JoyAI-Image-OpenSpatial背后的数据源揭秘
  • 从小白到高手:easy-canvas事件系统完全指南
  • 电机三维温度场自动建模:从数据到可视化模型的完整实现路径
  • 3分钟解决Windows远程桌面多用户连接问题:RDPWrap.ini配置指南
  • 盘点6款批量修改图片尺寸工具,覆盖网页端、电脑自带与微信小程序 - 软件小管家
  • Mission Planner:免费开源的ArduPilot无人机地面站完整指南
  • nemo-nano-codec-22khz-1.89kbps-21.5fps的伦理考量:安全、隐私与负责任AI实践
  • LFM2.5-2.6B-nvfp4 vs 原版模型:nvfp4量化带来的10倍性能提升与质量对比
  • 10分钟上手Wine Staging:新手必备的Windows程序兼容工具
  • 磁盘空间告急?5个实用技巧让Krokiet帮你快速清理重复文件和相似图片
  • 如何快速上手JoyAI-Image-OpenSpatial:3行代码玩转230万空间问答样本
  • 从安装到预测:Moirai-1.0-R-Large完整部署指南(含代码示例)
  • ADR安全审计:企业AI代理防护效果评估
  • 提升Vue.js应用性能的7个秘诀:vuejs-advanced-learning最佳实践
  • 2026合肥大闸蟹店选择参考各区域靠谱门店汇总 - 滚动商讯
  • Codex多分支开发为什么越来越容易冲突?用Git工作流减少重复合并
  • Claude Composer与MCP服务器集成:扩展AI工具能力的高级配置指南
  • 从论文到实践:PatchTST-ETTh1-Pretrain模型背后的7大技术创新
  • 稿定AI使用指南:核心功能与场景应用解析
  • Claude Composer核心功能解析:自动确认、工具集管理与系统通知