1. 程式人生 > >反素數

反素數

rime 問題 一個 1-n tip 開始 反素數 code get

素數的約數只有1和本身, 而反素數是約數盡可能多, 多到,比它小的數, 約數就不會比它多。、

性質

反素數的通式:
p=2^t1 * 3^t2 * 5^t3 * 7^t4 .....( t1>=t2 >= t3 >= ....)
盡可能多就表現在

  1. 質因子是從最小的2開始的連續的質數
  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) ); 
      }
}

反素數