题目描述

对于任何正整数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. 使用SqlConnectionStringBuilder构造数据库连接字符串

    在实际开发过程中,很多时候会拷贝一个现有的数据库连接字符串,修改对应的数据库名.用户名.密码等配置成新的数据库连接字符串.但是有时候我们需要增加一些额外的配置,比如超时时间,最大连接池等,此时我们可以 ...

  2. python基础知识(一)

    Python基础知识 计算基础知识 1.cpu 人类的大脑 运算和处理问题 2.内存 临时存储数据 断电就消失了 3.硬盘 永久存储数据 4.操作系统 调度硬件设备之间数据交互 python的应用和历 ...

  3. dubbo循序渐进 - 什么是RPC

    RPC的核心并不在于使用什么协议.RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里.通过RPC能解耦服务,这才是使用RPC的真正目的.RPC的原理 ...

  4. sweetalert 弹框简单使用

    sweetalert网站 简单使用教程 拷贝文件 放到项目中 使用 页面效果 修改代码应用到事件中 成功删除演示(后台数据也会删除) 作 者:郭楷丰 出 处:https://www.cnblogs.c ...

  5. Nginx作为代理服务

    代理服务简介 什么是代理服务 代理-代理办理(代理理财.代理收货.代理购物等等). HTTP请求没有代理服务的模型图 HTTP请求具有代理服务的模型图 代理分类 正向代理 反向代理 正向代理 当局域网 ...

  6. [ ERROR ] Error in test library 'pymysql': Creating keyword 'Connect' failed: Keyword with same name defined multiple times.

    [ ERROR ] Error in test library 'pymysql': Creating keyword 'Connect' failed: Keyword with same name ...

  7. cookie和session。

    Cookie和Session: 会话技术: 1.会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止. 2.功能:在一次会话的范围内的多次请求间 ...

  8. 关于子类和父类中的this的用法

    public class Demo { public static void main(String[] args) { Fu f = new Zi(); f.show(); } } class Fu ...

  9. 目标检测论文解读4——Faster R-CNN

    背景 Fast R-CNN中的region proposal阶段所采用的SS算法成为了检测网络的速度瓶颈,本文是在Fast R-CNN基础上采用RPN(Region Proposal Networks ...

  10. PAT 乙级 1011.A+B 和 C C++/Java

    题目来源 给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行, ...