
cf1512G - Short Task //on
问题分析:d(n) 是n的所有因数之和,这是一个积性函数。我们可以利用积性函数的性质来预处理结果。 预处理策略:我们需要预处理一个数组ans,其中ans[c]存储满足d(n)=c的最小n。预处理的时间复杂度是O(n log n),适用于n=1e7的情况。 计算因数和:使用欧拉筛法来计算每个数的因数和。对于每个质数p,计算其幂次的因数和,然后利用积性函数的性质来计算合数的因数和。 优化预处理:通过遍历每个数i,对i的倍数进行更新,计算每个数的因数和,并记录最小的n。 初始化数组:d数组用于存储每个数的因数和,ans数组用于存储每个c对应的最小n。 预处理d数组:遍历每个数i,对i的倍数进行更新,计算每个数的因数和。 预处理ans数组:遍历每个数i,找到最小的n使得d(n)=i,并将ans[i]记录下来。 处理查询:对于每个查询,直接输出ans[c]即可。
发布日期:2021-05-07 22:06:57
浏览次数:19
分类:精选文章
本文共 967 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要预处理一个数组来快速回答每个查询。具体来说,我们需要找到最小的n,使得d(n)等于给定的c。d(n)定义为n的所有因数的和。
方法思路
解决代码
#includeusing namespace std;const long long N = 1e7 + 10;ll d[N], ans[N];int main() { for (ll i = 1; i < N; ++i) { for (ll j = i; j < N; j += i) { d[j] += i; } } for (ll i = 1; i < N; ++i) { if (d[i] < N && ans[d[i]] == -1) { ans[d[i]] = i; } } ll T; cin >> T; while (T--) { ll c; cin >> c; cout << ans[c] << endl; } return 0;}
代码解释
这种方法利用预处理技术,使得每个查询的时间复杂度为O(1),非常高效。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月03日 20时37分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
程序员应该知道的97件事
2019-03-05
我编程,我快乐—程序员职业规划之道
2019-03-05
create-react-app路由的实现原理
2019-03-05
PSI值
2019-03-05
海思Hi3531DV100开发环境搭建
2019-03-05
JavaScript上传下载文件
2019-03-05
Linux驱动开发之PCIe Host驱动
2019-03-05
Vue.js Element Basic组件使用
2019-03-05
android 头像选择,裁剪全套解决方案,你值得拥有!
2019-03-05
MapReduce
2019-03-05
springboot swagger2
2019-03-05
shell(十)case的几个典型应用
2019-03-05
Linux环境变量配置错误导致命令不能使用(杂谈)
2019-03-05
openstack安装(六)镜像glance服务安装
2019-03-05
openstack安装(九)网络服务的安装--控制节点
2019-03-05
shell编程(六)语言编码规范之(变量)
2019-03-05
vim杂谈(三)之配色方案
2019-03-05
vim杂谈(五)之vim不加载~/.vimrc
2019-03-05
Linux杂谈之终端快捷键
2019-03-05
vimscript学习笔记(二)预备知识
2019-03-05