1、如果我們要求一個數的所有因數的個數會怎么去求呢?
首先想到最簡單的方法就是暴力求解就可以。當然數據小、或者測試數據少就很簡單就可以過了。
2、如果求一個區間內的數的所有因數的個數呢?或者求一個區間內的數的因數最大的數以及最大的因數(正因數)的個數?
這樣的話,數據大一些,組數多一些,可能就要Tle,所以可以想到用唯一分解定理,但是那是適用於分解成素因數,要怎么轉化呢?
這就需要用到了約數個數定理。
約數個數定理
對於一個大於1正整數n可以分解質因數:
則n的正約數的個數就是
。
其中a1、a2、a3…ak是p1、p2、p3,…pk的指數。
(在證明上自己自行百度搜索就可以了。qwq)
3、如果我們需要求這個區間內具有最大個數因數的這個數的所有因數之和怎么辦呢?
因為剛剛是按素因數來分解的,如果只是加上相應的次方數,肯定是不對的,那么要怎么解決這個問題呢,當時想了好久,不過腦子笨,采用各種暴力,當然也有成效,不過還是看看下面這個方法吧。
約數和定理
對於一個大於1正整數n可以分解質因數:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
則由約數個數定理可知n的正約數有(a₁+1)(a₂+1)(a₃+1)…(ak+1)個,
那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)個正約數的和為
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)。
這個公式蠻好理解,但是要怎么去實現呢?
先把素因子存起來,再把冪指數存起來,最后依次加上,這樣的方法當然可以,但是總歸比較麻煩。
來看一下這個定理:設正整數n有素因子分解 n =(p1^α1)*(p2^α2)*(p3^α3)* ....... *(pk^αk),那么
所有因數和 σ(n)=[(p1^α1)-1 ] /(p1-1) * [(p2^α2)-1 ] / (p2-1) * ..... *[(pk^αk)-1 ]/(pk-1)
那么在每次遍歷到該因數數,直接算一下累加起來就可以了。
代碼板子回來再寫QAQ.
參考文獻:百度百科等網絡資料加上自己理解。