日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

调和级数的优化

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调和级数的优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: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);
  • 再求出后面所有項之和

  • long long m=sqrt(n), ans=0;for(i=1; i<=m; i++)ans+=i*(n/i-n/(i+1));

    解析:在進行(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;

    未來是否繁花似錦,源自我們當下的努力

    總結

    以上是生活随笔為你收集整理的调和级数的优化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。