P1403 AHOI2005 約數研究

2022-08-12 22:18:24 字數 1189 閱讀 4985

這裡還是用到辣個公式:

\[\sum_^nd_1(i)=\sum_^n\lfloor \frac \rfloor

\]注意:這個公式對總體成立,對個體不成立!

所以你就有兩種思路:

轉化為「餘數求和」那種思路,使用除法分塊來解決這打道題。

直接上線性篩(我的思路)。

線性篩怎麼求出約數個數?

乙個數\(x\)可以分解質因數變成這樣的樣子:

\[x=a_1^a_2^...a_n^

\]那麼它的約數個數可以表示為:

\[(1+p_1)(1+p_2)...(1+p_n)

\]那麼我們就可以使用約數個數定理結合線性篩來求約數個數了。

前提:我們使用乙個陣列記錄最小的\(p\)即\(p_1\),這裡用mm表示。

顯然約數個數只有2個,且最小的項是1,因為只能分解出1和它自己。

這個時候說明乙個很重要的事情:\(prime[j]\)是我們要篩那個數的最小素因子。這個結論來自線性篩的性質。

所以被篩的那個數的約數個數式子的第一項一定會變成\((1+1)\),所以那個\(p_1\)更新為1。

那麼新數的約數個數就需要乘以2了。為了方便並且體現出積性函式的性質,你可以像我那樣那麼寫。

這個時候說明新數中其實就有\(prime[j]\)這個因子了,而上面的情況是沒有的。

所以新數就是在原來的最小素因子的指數上再加了個1。因為我現在多乘了它,所以指數需要加1。

那麼新數的第一項就會變成\((1+p_1+1)\)。所以約數個數,我們要先除以\((1+p_1)\)再乘以\((2+p_1)\)。

這就是為什麼我們要記錄最小素因子的原因。需要在這裡用到。

然後就直接實現就好了哇。

**:

#includeconst int maxn = 1000005;

bool notprime[maxn];

int prime[maxn], tot;

int ys[maxn], mm[maxn];

int n;

void init()

for(int j = 1; j <= tot && i * prime[j] <= n; j++)

else}}

}int main()

線性篩這些東西稍不注意就打錯了,而暴力分解質因數就沒那麼容易錯了。所以你可以拿去對拍哦!

P1403 AHOI2005 約數研究

科學家們在samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機 samuel ii 的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用 samuel ii 進行數學研究。小聯最近在研究和約數有關的問題,他統計每個正數n的約數的個數,並以f n 來表示。例...

題解 P1403 AHOI2005 約數研究

題目 看到題解區很多人直接給出結論 答案為 displaystyle sum n lfloor rfloor 沒給出證明,這裡給出證明 首先,我們可以知道 displaystyle f n sum 1 有的同學看不懂這個公式,我解釋一下,這個公式表達 列舉 n 的因數 d 每列舉乙個因數 d f n...

洛谷 p1403 AHOI2005 約數研究

題目描述 科學家們在samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機 samuel ii 的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用 samuel ii 進行數學研究。小聯最近在研究和約數有關的問題,他統計每個正數n的約數的個數,並以f n ...