BZOJ 1053 [HAOI2007]反素数ant
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 1053 [HAOI2007]反素数ant
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
53: [HAOI2007]反素數ant
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
1000Sample Output
840當我見到這道題的時候是很開心的,這不就是在東北育才當時我打表過70分的divisorful數嗎?細細一想,會發現: 一個合法的divisorful數x要求:0<i<x間存在至多一個數,其約數個數比x多。 ?而一個合法的反質數x要求:0<i<x間不存在任何一個數,其約數個數比x多。 我們可以想,對于一個divisorful數,一定是小因子占先。 例如,6=2*3,約數個數為4。然而,437=19*23,也是4個。很明顯不是。 而這種題,如果打表,會發現整個divisorful數集其實極其稀疏。那么,我們就可以逐步加入各質因數p,讓原divisorful數集中的數*p,*p^2,*p^3,*p^4……直到查詢的邊界。然后將其排序,去掉不合法的數。如果數集沒有變化,就結束了。 我們總結一下,這樣的題滿足:
- 可以使用數集表示,數集本身較稀疏
- 可以按合理的順序逐步加入元素,并可貪心化break
- 加入新元素時可以較快建立其維護信息
然而,我發現其他人根本沒有這樣想……
hzwer如是說:
本題似乎要先知道許多結論,不要問我證明。。
一個數約數個數=所有素因子的次數+1的乘積
舉個例子就是48 = 2 ^ 4 * 3 ^ 1,所以它有(4 + 1) * (1 + 1) = 10個約數
然后可以通過計算得一個2000000000以內的數字不會有超過12個素因子
并且小素因子多一定比大素因子多要優
預處理出前12個素數直接爆搜即可
霎時間感覺自己被打臉。所謂的結論是:不超過N的最大的反質數是1~N間約數最多且相對最小的值x。很明顯,這樣的數x是一個反質數。若1~N間存在著更大的反質數,則顯然月數個數比x多,與x約數最多矛盾。
于是只需找1~N間約數最多且相對最小的值x,暴搜居然效率也很高。
但是,暴搜和我的方法時間差不多,而我卻算出了所有的反質數。若要打表,顯然更優。
轉載于:https://www.cnblogs.com/Doggu/p/bzoj1053.html
總結
以上是生活随笔為你收集整理的BZOJ 1053 [HAOI2007]反素数ant的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java开发中字符编码出现乱码的处理
- 下一篇: MySQL 5.1完全卸载