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

信息学奥赛一本通 1625:【例 1】反素数 Antiprime | 洛谷 P1463 [POI 2001 R1 / HAOI2007] 反素数

【题目链接】

ybt 1625:【例 1】反素数 Antiprime
洛谷 P1463 [POI 2001 R1 / HAOI2007] 反素数

【题目考点】

1. 算术基本定理(分解质因数)

每个正整数 x x x都可以进行质因数分解,写成公式为 x = p 1 a 1 p 2 a 2 . . . p n a n x = p_1^{a_1}p_2^{a_2}...p_n^{a_n} x=p1a1p2a2...pnan,其中 p 1 ∼ p n p_1\sim p_n p1pn都为 x x x的质因数。
x x x的约数个数为 ( a 1 + 1 ) ( a 2 + 1 ) . . . ( a n + 1 ) (a_1+1)(a_2+1)...(a_n+1) (a1+1)(a2+1)...(an+1)

2. 深搜回溯

【解题思路】

如果某个正整数 x x x 满足: ∀ 0 < i < x \forall 0 \lt i \lt x ∀0<i<x,都有 g ( x ) > g ( i ) g(x) \gt g(i) g(x)>g(i),则称 x x x反素数
也就是说,如果x是反素数,那么x就是1~x中约数数量最多的数,且1~x-1中任何一个数的约数个数不能等于x的约数个数。
本题要想求1~n中的最大反素数,该反素数必须是1~n中约数数量最多的数。在约数数量最多的各数中,其中的最小的数为1~n中的最大反素数

因为如果选择x,且有 y < x , g ( x ) = g ( y ) y<x,g(x)=g(y) y<xg(x)=g(y),那么x就不满足 ∀ 0 < i < x \forall 0 \lt i \lt x ∀0<i<x,都有 g ( x ) > g ( i ) g(x) \gt g(i) g(x)>g(i)

设1~n中的最大反素数为 m m m。对 m m m分解质因数得 m = p 1 a 1 . . . p r a r m=p_1^{a_1}...p_r^{a_r} m=p1a1...prar
p i p_i pi表示第i个质数。即 p 1 = 2 , p 2 = 3 , p 3 = 5 , . . . p_1=2, p_2=3, p_3=5,... p1=2,p2=3,p3=5,...

引理1:序列 a 1 , a 2 , . . . , a r a_1, a_2, ..., a_r a1,a2,...,ar是不升序列,即 a i ≥ a i + 1 a_i\ge a_{i+1} aiai+1

该引理可以描述为:1~n中的最大反素数为 m m m,在 m = p 1 a 1 . . . p r a r m=p_1^{a_1}...p_r^{a_r} m=p1a1...prar中,如果 i < j i<j i<j,则 a i ≥ a j a_i\ge a_j aiaj

反证法:假设 i < j i<j i<j时, a i < a j a_i<a_j ai<aj
m m m中包含乘积 p i a i p j a j p_i^{a_i}p_{j}^{a_j} piaipjaj,可以记为 m = v ⋅ p i a i p j a j m=v\cdot p_i^{a_i}p_{j}^{a_j} m=vpiaipjaj
m m m的约数个数包含乘积 ( a i + 1 ) ( a j + 1 ) (a_i+1)(a_j+1) (ai+1)(aj+1) m m m的约数个数可以记为 u ⋅ ( a i + 1 ) ( a j + 1 ) u\cdot (a_i+1)(a_j+1) u(ai+1)(aj+1)
交换 p i p_i pi p j p_j pj的指数,将 p i p_i pi的指数变为 a j a_j aj p j p_j pj的指数变为 a i a_i ai
得到的新的数为 m ′ = v ⋅ p i a j p j a i m'=v\cdot p_i^{a_j}p_j^{a_i} m=vpiajpjai m ′ m' m的约数个数仍为 u ⋅ ( a i + 1 ) ( a j + 1 ) u\cdot (a_i+1)(a_j+1) u(ai+1)(aj+1)
由于 j > i j>i j>i,所以 p j > p i p_j>p_i pj>pi,因此 p j a j − a i > p i a j − a i p_j^{a_j-a_i}>p_i^{a_j-a_i} pjajai>piajai,即 p j a j p j a i > p i a j p i a i \frac{p_j^{a_j}}{p_j^{a_i}}>\frac{p_i^{a_j}}{p_i^{a_i}} pjaipjaj>piaipiaj
所以 p j a j p i a i > p i a j p j a i p_j^{a_j}p_i^{a_i}>p_i^{a_j}p_j^{a_i} pjajpiai>piajpjai
所以 m > m ′ m>m' m>m
因此 m ′ m' m是约数个数与 m m m相等的,数值更小的数。这与 m m m是反素数相矛盾。
因此对反素数 m m m分解质因数后,其质因数的指数序列是不升序列。

根据上述性质, m m m的质因数只能是前几个连续的质数,一旦有一个质数的指数为0,后面的质数指数就都必须为0。
已知 n ≤ 2 ∗ 1 0 9 n\le 2*10^9 n2109,假设每个质数的指数都为1,最多可能用到的质数只有前9个质数。

2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 ∗ 23 = 223092870 < 2 ∗ 1 0 9 2*3*5*7*11*13*17*19*23=223092870<2*10^9 23571113171923=223092870<2109
2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 ∗ 23 ∗ 29 = 6469693230 > 2 ∗ 1 0 9 2*3*5*7*11*13*17*19*23*29=6469693230>2*10^9 2357111317192329=6469693230>2109

prime数组保存前9个质数。
需要确定的只有9个质因数的指数,可以使用深搜回溯算法。
搜索确定每个质因数的指数,下一个质因数的指数必须小于等于上一个质因数的指数,维护状态包括:当前已经确定的数值(质因数幂的乘积),以及当前数值的约数个数。
假设已经确定的数值 s = p 1 a 1 . . . p k − 1 a k − 1 s=p_1^{a_1}...p_{k-1}^{a_{k-1}} s=p1a1...pk1ak1,该数值的约数个数为 d i v N u m = ( a 1 + 1 ) ( a 2 + 1 ) . . . ( a k − 1 + 1 ) divNum=(a_1+1)(a_2+1)...(a_{k-1}+1) divNum=(a1+1)(a2+1)...(ak1+1)当前本次搜索要确定 a k a_k ak的值, a k a_k ak的值必须小于等于 a k − 1 a_{k-1} ak1,确定 a k a_k ak的值后,已经确定的数值为 p 1 a 1 . . . p k − 1 a k − 1 p k a k p_1^{a_1}...p_{k-1}^{a_{k-1}}p_k^{a_k} p1a1...pk1ak1pkak,比已有数值 s s s多乘上了 p k a k p_k^{a_k} pkak,;约数个数为 ( a 1 + 1 ) ( a 2 + 1 ) . . . ( a k + 1 ) (a_1+1)(a_2+1)...(a_k+1) (a1+1)(a2+1)...(ak+1),比已有数值 d i v N u m divNum divNum多乘上了 ( a k + 1 ) (a_k+1) (ak+1)
如果得到的数值大于n,或已经访问完前9个质数,则结束搜索。

保存“最大的约数个数maxDivNum”以及“最小的约数个数最多的数值minPro”。

  • 如果当前数值s的约数个数divNum大于最大的约数个数maxDivNum,那么最大的约数个数maxDivNum就是当前的divNum,约数个数最多的数值minPro为s。
  • 如果当前数值s的约数个数divNum等于最大的约数个数maxDivNum,而且当前的数值s比已有的约数个数最多的数值minPro更小,那么将最小的约数个数最多的数值minPro设为s。

最后结果为最小的约数个数最多的数值minPro。

【题解代码】

解法1:深搜回溯
#include<bits/stdc++.h>
using namespace std;
int n, minPro = 2e9, maxDivNum;
int prime[15] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23};
//k:prime的下标,mxInd:上一个质因数的指数,s:数值, divNum:约数个数 
void dfs(int k, int mxInd, int s, int divNum)
{if(divNum > maxDivNum || divNum == maxDivNum && s < minPro){minPro = s;//最小的满足条件的反素数数值 maxDivNum = divNum;//minPro的约数个数 }if(k > 9)return;long long pro = 1;//prime[k]^ifor(int i = 1; i <= mxInd; ++i){pro *= prime[k];if(s*pro > n)break;dfs(k+1, i, s*pro, divNum*(i+1));}
}
int main()
{cin >> n;dfs(1, 30, 1, 1);cout << minPro;return 0;
}
http://www.dtcms.com/a/601116.html

相关文章:

  • 如何做网站长尾关键词布局工程公司取名字大全
  • 深度学习:从零开始手搓一个深层神经网络
  • Docker 多服务镜像构建完整教程
  • Docker 启动 EMQX 5.x 并配置自签名证书
  • 网站招工费怎么做会计分录小小视频免费观看高清
  • C++重点知识梳理(上)
  • 长沙市建设局官方网站wordpress 显示文章标签
  • 基于用户评论分析挖掘的旅游景点推荐系统
  • 宣传旅游网站建设的重点是什么装修公司哪家好排名
  • 【C语言学习笔记】动态内存分配:malloc/free的正确打开方式
  • HOVER:用于人形机器人的多功能全身神经控制器
  • 学会给网页穿衣服——学习 CSS 语言
  • Android11-Launcher3 定制-去除副屏幕-可以滑动效果 - 篇二
  • 在 ubuntu怎么创建一个新用户,并且设置为默认自动登录用户,最简单
  • 字符串的陷阱与艺术——std::string全解析
  • 深信服云桌面有什么替代方案?
  • 网页制作与网站建设试卷及答案wordpress 默认文章形式
  • 企业为什么要建立自己的网站云南工程建设信息网站
  • Dubbo如何使用Nacos做注册中心的
  • 决策树悲观错误剪枝(PEP)详解:原理、实现与应用
  • 外卖项目 day01
  • 前端vue3 window.open 项目部署后页面404解决办法
  • pc网站 手机网站 微信网站 上海跨境电商官方网站建设
  • Windows 10 C语言编译器安装与配置
  • 网站后台进不去的原因挂机宝做php网站吗
  • Java I/O模型演进 — BIO、NIO与AIO的原理与实战
  • Flutter---泛型
  • 小米Java开发200道面试题及参考答案(上)
  • 【实战】如何优雅的在Win11/10系统下运行Rust编写的binwalk v3.1.1
  • 网站建设费可以计入管理费用吗手机网站开发利用流程