题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?

输入格式

一个数N(1<=N<=2,000,000,000)。

输出格式

不超过N的最大的反质数。

输入输出样例

输入 #1
1000

输出 #1

840


2019/8/21-更新(代码后面写不了了,只能写在前面...):

上午刚做的题,下午老师就讲了,搞得我好像白写了题解o(一︿一+)o,所以就顺便把老师的课件附上来吧!

(别忘了后面还有我自己写的...


首先普及下关于“反素数”的两个性质:

  • 性质一:一个反素数的质因子必然是从2开始连续的质数.

  • 性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

然后,我再说下我个人的理解

  • 因为题目给出了n的范围,所以我们可得出结论:n的质因子的种数不超过10,所以得到了一条递归边界;

  • 因为“反素数”的性质二,所以在两个数约数相等的情况下,更小的那个数就是“反素数”(可以用反证法证明:如果存在a的约数个数与b相等,且a>b。若认为a为“反素数”,那么不满足小于a的数的约数个数都小于a的约数个数,矛盾;)。所以我们要求的答案显然就是不大于n的  约数个数最大的  最小的数(哇这句话真的要好好理解,性质二肥肠关键!;

  • 那么应用到本题,在递归的过程中,如果遇到两个数约数个数相同,并且当前得到的数now小于之前得到的数ans,那就更新ans;如果当前求得的数now的约数个数num已经大于之前求到的最大的约数个数tot,那就更新tot,并且别忘了也要更新ans;

  • 如果在递归过程中,当前求得值已经大于n,那么就没必要再继续递归下去,直接返回,这就是第二条递归边界;

  • 在递归函数中设置一个循环,每进行一个循环,当前递归的质因子的个数就加一,并且此处还可以进行一点剪枝,在循环条件中加入“当前递归的质因子个数  不大于  比其小的质因子的 个数”这个条件;

我在这里给出两种代码,思想大概就是我上面所述,只不过写法略有不同,大家可以选择自己更喜欢的一种啦~

(顺便,看我码字不易,怎么说也给个“推荐”吧♪(^∀^●)ノ

 #include<bits/stdc++.h>
using namespace std;
const int N=1e6+,inf=0x3f3f3f3f;
int a[]={,,,,,,,,,,};//打表大法好(质因子种数不超过10)
long long n,ans,tot;//tot为求到的最大的约数个数
void f(long long x,long long now,long long shu,long long num)
{
//x为当前递归的质因子,now为当前求得的数,num为now的约数个数
if(x==)return ;//递归边界1
long long tmp=,i;
for(i=;i<=shu;i++)//当前递归的质因子的个数不超过shu(想不到其他变量名惹...无奈词汇量太小)
{
tmp*=a[x];//tmp暂时存储
if(now*tmp>n)return ;//递归边界2
if(num*(i+)==tot&&now*tmp<ans)ans=now*tmp;//如果约数个数相同,并且当前得到的数now小于之前得到的数ans,那就更新ans;
if(num*(i+)>tot)//如果now的约数个数num大于之前求到的最大的约数个数tot,那就更新tot,并且更新ans;
{
tot=num*(i+);
ans=now*tmp;
}
f(x+,now*tmp,i,num*(i+));//往下递归
}
}
int main()
{
cin>>n;
f(,,,);
printf("%lld",ans);
return ;
}

我比较喜欢下面的代码↓↓↓

 #include<bits/stdc++.h>
using namespace std;
const int N=1e6+,inf=<<;
int a[]={,,,,,,,,,,},used[];//used[i]是指表中第i个质因子的个数
long long n,ans,tot;
void f(long long id,long long now,long long num)
{
//id指当前递归的是表中的第几个质数,now和num同上一种做法
if(num>tot)//同上一种做法
{
ans=now;
tot=num;
}
if(num==tot&&now<ans)ans=now;//同上一种做法
used[id]=;//注意每次递归要更新
while(now*a[id]<=n&&used[id]+<=used[id-])//循环条件中也包含了递归边界2(然鹅这里没有用递归边界1
{
now*=a[id];//now更新
used[id]++;//当前递归的质因子个数加一
f(id+,now,num*(used[id]+));//继续递归
}
}
int main()
{
cin>>n;
used[]=inf;//注意!要保证在对第一个质数进行递归的时候,循环可以进行下去,详见used[id]+1<=used[id-1]
f(,,);
printf("%lld",ans);
return ;
}

反素数 Antiprime(信息学奥赛一本通 1625)(洛谷 1463)的更多相关文章

  1. 一本通1625【例 1】反素数 Antiprime

    反素数 Antiprime 题目描述 原题来自:POI 2001 如果一个大于等于 1 的正整数 n,满足所有小于 n 且大于等于 1 的所有正整数的约数个数都小于 n 的约数个数,则 n 是一个反素 ...

  2. 1625: 【例 1】反素数 Antiprime

    1625: [例 1]反素数 Antiprime [题目描述] 原题来自:POI 2001 如果一个大于等于 1 的正整数 n,满足所有小于 n 且大于等于 1 的所有正整数的约数个数都小于 n 的约 ...

  3. $ybt\ 【信息学奥赛一本通】题解目录$

    [信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...

  4. 【03NOIP普及组】麦森数(信息学奥赛一本通 1925)(洛谷 1045)

    [题目描述] 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它 ...

  5. 「SDOI2014」旅行(信息学奥赛一本通 1564)(洛谷 3313)

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我 ...

  6. 【00NOIP普及组】计算器的改良(信息学奥赛一本通 1910)(洛谷 1022)

    [题目描述] NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先 ...

  7. 【00NOIP普及组】税收与补贴问题(信息学奥赛一本通 1911)( 洛谷 1023)

    [题目描述] 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给 定的最高价位后,销量以某固定 ...

  8. 食物链【NOI2001】(信息学奥赛一本通 1390)

    [题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...

  9. 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)

    题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...

随机推荐

  1. 面对代码中过多的if...else的解决方法

    原 6个实例详解如何把if-else代码重构成高质量代码 置顶 2017年09月11日 23:47:12 yinnnnnnn 阅读数 21433更多 分类专栏: # 理论   版权声明:本文为博主原创 ...

  2. winform datagridview控件使用

    最近做项目时,显示查询结果总需要绑定到datagridview控件上显示,总结了给datagridview绑定数据的方式,以及导出datagridview数据到excel表格,如有错误请多指教 1.直 ...

  3. 【转载】C#使用InsertRange方法往ArrayList集合指定位置插入另一个集合

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,ArrayList集合可存储多种数据类型的对象.在实际的开发过程中,我们可以使用InsertRange方法在ArrayList集合指 ...

  4. 24、vuex刷新页面数据丢失解决办法

    刷新页面时候将state数据保存到localStorage里面: export default { name: 'App', created () { //在页面加载时读取localStorage里的 ...

  5. Java集合学习(3):HashSet

    一.概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. HashSet是基于Has ...

  6. php与阿里云短信接口接入

    使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证+官方审核多次,尤其审核需要保持耐心. 1. accessKeyId  相当于你的个人账户密钥: 2. accessKeySec ...

  7. Docker搭建Gogs

    Gogs需要使用到数据库,需要先安装数据库(如mysql),并创建名为gogs的数据库,启动后需要配置数据库连接. 镜像获取:docker pull gogs/gogs 安装运行: docker ru ...

  8. 《linux就该这么学》课堂笔记10 SWAP、磁盘容量配额、软硬链接、RAID

    1988年,加利福尼亚大学伯克利分校首次提出并定义了RAID技术的概念.RAID技术通过把多个硬盘设备组合成一个容量更大.安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备 ...

  9. Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制

    Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基于用户的访问控制概述 认证质询: WWW-Auth ...

  10. 将java的jar包作为windows的服务来启动

    1.在idea中用maven将程序打成jar,放到运行的目录中. 2.去github上面下载winsw: https://github.com/kohsuke/winsw/releases 3. 将W ...