1. 程式人生 > >洛谷P1403 約數研究

洛谷P1403 約數研究

        題目連結:https://www.luogu.org/problemnew/show/P1403 約數研究

題意如下:

科學家們在Samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機“Samuel II”的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用“Samuel II”進行數學研究。

小聯最近在研究和約數有關的問題,他統計每個正數N的約數的個數,並以f(N)來表示。例如12的約數有1、2、3、4、6、12。因此f(12)=6。下表給出了一些f(N)的取值:

f(n)表示n的約數個數,現在給出n,要求求出f(1)到f(n)的總和。

輸入輸出格式

輸入格式:

 

輸入一行,一個整數n

 

輸出格式:

輸出一個整數,表示總和

 

輸入輸出樣例

輸入樣例#1: 複製

3

輸出樣例#1: 複製

5

        剛開始用暴力求解奈何只對了三個點,其餘都超時。。。無奈看了大佬們的題解,發現了一個非常好用的東西,他們說是“貢獻”。既給定了n之後,每個i的貢獻

思路:

舉個例子:對於n=6而言:

首先,約數為1的個數有6個,分別是1, 2, 3, 4, 5, 6;

約數為2的個數有3個,分別是2, 4, 6,

約數為3的個數有2個,分別是3, 6;

約數為4的個數沒有,約數為5的個數沒有。

約數為6的個數有一個,為6

因此,即為n%i(這是最重要的推出的結論),剩下的我覺得沒有啥好註釋的了。。

AC程式碼如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int n, ans = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        ans += n/i;
    printf("%d", ans);
    return 0;
}