洛谷P1403 約數研究
阿新 • • 發佈:2018-12-17
題目連結: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; }