调和级数的优化
題目鏈接:https://vjudge.net/contest/304097#problem/H
調和級數的概念: ∑ k = 1 n 1 k \sum_{k=1}^{n}\frac{1}{k} ∑k=1n?k1?
題目中求: ∑ k = 1 n n k \sum_{k=1}^{n}\frac{n}{k} ∑k=1n?kn?
正常思路:
long long H( int n ) {long long res = 0;for( int i = 1; i <= n; i++ )res = res + n / i;return res; }若n (1 ≤ n < 2^31),上述代碼就會超時
優化過程:
先求出前sqrt(n)項和:即n/1+n/2+…+n/sqrt(n)
long long m=sqrt(n), ans=0;for(i=1; i<=m; i++)ans+=(n/i);再求出后面所有項之和
解析:在進行(2)步驟,它的每一項的值小于或者等于sqrt(n),計算值為1到sqrt(n)的項的個數,乘以其項值即可快速得到答案
舉例:
n=10
sqrt(10) = 3
先求出其前三項的和為10/1+10/2+10/3,再求后面
值為1的項:個數:10/1-10/2 分別是:10/10,10/9,10/8,10/7,10/6
值為2的項:個數:10/2-10/3 分別是:10/5,10/4
值為3的項:個數:10/3-10/4 分別是:sqrt(10)
注:當n/(int)sqrt(n) == (int)sqrt(n)時,值為sqrt(n)的值會被計算2次
完整代碼:
long long m=sqrt(n),ans=0;for(i=1; i<=m; i++) {ans+=(n/i);ans+=i*(n/i-n/(i+1));}i--;if(n/i==m)ans-=m;未來是否繁花似錦,源自我們當下的努力
總結
- 上一篇: 广州你让我泪流满面1
- 下一篇: 爱奇艺大数据实时分析平台的建设与实践