題解 P1403 AHOI2005 約數研究

2022-03-28 20:03:34 字數 1510 閱讀 4096

題目

看到題解區很多人直接給出結論:答案為 \(\displaystyle \sum_^n\lfloor\rfloor\) ,沒給出證明,這裡給出證明

首先,我們可以知道 \(\displaystyle f(n)=\sum_1\)

有的同學看不懂這個公式,我解釋一下,這個公式表達:

列舉 \(n\) 的因數 \(d\),每列舉乙個因數 \(d\), \(f(n)\) 加 \(1\)

\(d\mid n\) 指 \(d\) 是 \(n\) 的因數

這樣一來,我們就可以和題目的對應上了: \(f(n)\) 代表 \(n\) 的因數個數

\(\displaystyle f(n)=\sum_1\) 還有一種表達方式是 \(\displaystyle f(n)=\sum_^n[d\mid n]\)

後面那個鬼東西 \([d\mid n]\) 是乙個判斷正誤的函式,正確為 \(1\) ,錯誤為 \(0\)

這個應該理解起來也不難:

列舉每乙個數 \(d\) ,當 \(d\) 是 \(n\) 的因數時, \(f(n)\) 加 \(1\)

題目要求的 \(\displaystyle m=\sum_^n f(i)\)

我們代入上面的定義式:

\(\quad \displaystyle m\)

\(\displaystyle=\sum_^n\sum_1\)

\(\displaystyle=\sum_^n\sum_^i[d\mid i]\)

我們調換一下列舉的順序,把 \(d\) 的列舉提前。

相當於考慮 \(d=1\) 時,對 \(i=1,2,3\dots n\) 的貢獻; \(d=2\) 時對 \(i=1,2,3\dots n\) 的貢獻; \(\dots\) ;\(d=n\) 時對 \(i=1,2,3\dots n\) 的貢獻

\(\displaystyle=\sum_^n\sum_^n[d\mid i]\)

對於乙個固定的 \(d\) ,\(\displaystyle\sum_^n[d\mid i]\) 的意義非常直觀:

\(1\)~\(n\) 中,有多少個數以 \(d\) 為因數,即多少個數是 \(d\) 的倍數

應該是 \(\lfloor\rfloor\) 吧

所以我們得到 \(\displaystyle m=\sum_^n\lfloor\rfloor\)

那本蒟蒻就放 我碼風極醜的 **了:

c++ 版:

#includeusing namespace std;

int main(){

int n,ans=0;

cin>>n;

for(int i=1;i<=n;i++) ans+=n/i;

coutans=0

n=int(input())

for i in range(1,n+1):

ans+=n//i

print(ans)

最後安利一下本蒟蒻的部落格

P1403 AHOI2005 約數研究

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

P1403 AHOI2005 約數研究

這裡還是用到辣個公式 sum nd 1 i sum n lfloor frac rfloor 注意 這個公式對總體成立,對個體不成立!所以你就有兩種思路 轉化為 餘數求和 那種思路,使用除法分塊來解決這打道題。直接上線性篩 我的思路 線性篩怎麼求出約數個數?乙個數 x 可以分解質因數變成這樣的樣子 ...

洛谷 p1403 AHOI2005 約數研究

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