反素數
阿新 • • 發佈:2018-02-04
rime 問題 一個 1-n tip 開始 反素數 code get 素數的約數只有1和本身, 而反素數是約數盡可能多, 多到,比它小的數, 約數就不會比它多。、
性質
反素數的通式:
p=2^t1 * 3^t2 * 5^t3 * 7^t4 .....( t1>=t2 >= t3 >= ....)
盡可能多就表現在
- 質因子是從最小的2開始的連續的質數
- 小的質因子比大的質因子的數目更多
通式如上的約數個數為 ( t1 + 1) ( t2 +1 ) ( t3 + 1 ) *........
由此可見 t1, t2....的數目越多越好。
問題提出
把一個數的約數個數定義為該數的復雜程度,給出一個n,求1-n中復雜程度最高的那個數。如果有多個數復雜度相等,輸出最小的。
基本思路
由於所求的數擁有的小質因數盡可能多, 我們需要遍歷盡可能多的小質因數的情況, 在深度搜索大質因數的盡可能多的情況, 沒有必要不斷判斷 t1, t2, t3之間的關系。用 maxsum 記錄最大的約數個數即可。
輔助數組:const int prime[16]= {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
偽碼:
typedef long long ll;
getantiprime( 1, 1, 1, );
getantiprime( ll num, ll k, ll sum ){ if( sum > maxsum ) maxsum = sum ; for( int i=1 ; ; i++ ){ num *= prime[ k ]; getantiprime( num, k+1, sum*(i+1) ); } }
反素數