首页 > 代码库 > HAOI2007反素数
HAOI2007反素数
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1346 Solved: 732
[Submit][Status]
Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
HINT
题解:
先筛质数,首先我们知道分解质因数后 i=p1^s1*p2^s2...pk^sk;那么g(i)=(s1+1)*(s2+1)*(s3+1)...(sk+1)
所以我们枚举质数的指数,直接枚举不太好
我们可以发现一个性质,反质数的各个指数一定是不上升的,因为上升的情况我们可以翻转上升的那一段,使得g不变i变小,这个时候搜索就无压力了
一开始没注意,其实前十个质数相乘已经很大了,我们只要前十个就行了
还有就是,要记录现在ans的g,如果有一样的g,要选小的那个
代码:
1 const p:array[1..10] of longint=(2,3,5,7,11,13,17,19,23,29); 2 var n,ans,num:int64; 3 procedure dfs(x,y,z,k:int64); 4 var i:longint; 5 begin 6 if (num<k) or ((num=k) and (x<ans)) then 7 begin 8 ans:=x;num:=k; 9 end;10 for i:=1 to y do11 begin12 x:=x*p[z];13 if x>n then exit;14 dfs(x,i,z+1,k*(i+1));15 end;16 end;17 procedure main;18 begin19 readln(n);20 dfs(1,n,1,1);21 writeln(ans);22 end;23 begin24 main;25 end.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。