c++ - 如何求和序列?

标签 c++ algorithm math discrete-mathematics

我如何总结以下序列:

⌊n/1⌋ + ⌊n/2⌋ + ⌊n/3⌋ + ... + ⌊n/n⌋

这只是 C++ 上的 O(n) 解决方案:

#include <iostream>
int main()
{
   int n;
   std::cin>>n;
   unsigned long long res=0;
   for (int i=1;i<=n;i++)
   {
      res+= n/i;
   }
   std::cout<<res<<std::endl;
   return 0;
}

你知道比这更好的解决方案吗?我的意思是 O(1) 或 O(log(n))。感谢您的宝贵时间:) 和解决方案

编辑: 感谢您的所有回答。如果有人想要解决方案 O(sqrt(n)): python :

import math
def seq_sum(n):
 sqrtn = int(math.sqrt(n))
 return sum(n // k for k in range(1, sqrtn + 1)) * 2 - sqrtn ** 2
n = int(input())
print(seq_sum(n))

C++:

#include <iostream>
#include <cmath>
int main()
{
   int n;
   std::cin>>n;
   int sqrtn = (int)(std::sqrt(n));
   long long res2 = 0;
   for (int i=1;i<=sqrtn;i++)
   {
      res2 +=2*(n/i);
   }
   res2 -= sqrtn*sqrtn;
   std::cout<<res2<<std::endl;
   return 0;
}

最佳答案

这是Dirichlet's divisor summatory function D(x) .使用以下公式 (source)

D(x)

在哪里

u

给出以下 O(sqrt(n)) 伪代码(恰好是有效的 Python):

def seq_sum(n):
  sqrtn = int(math.sqrt(n))
  return sum(n // k for k in range(1, sqrtn + 1)) * 2 - sqrtn ** 2

注意事项:

关于c++ - 如何求和序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768625/

相关文章:

algorithm - 如何在图表中表示数据的微小变化

c++ - 在 android 上移植 C++ lib/app

c++ - 有效地删除所有重复记录

按小于 x 的一组数字列出所有可能的倍数的算法

algorithm - 图中的单一目的地最短路径

algorithm - 按比例平衡 3 个值

python - Python 中的辛普森规则

c++ - 如何将一个qt3库完全移植到qt4?

python - 使用 char 指针函数和 std::string 调用线程会产生不同的结果

c++ - 使 std::map key const 有意义吗?