標籤:des style class blog code http
1053: [HAOI2007]反素數antTime Limit: 10 Sec Memory Limit: 162 MB
Submit: 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 Input1000
Sample Output840
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.
View Code