gpt4 book ai didi

c++ - 如何求和序列?

转载 作者:IT老高 更新时间:2023-10-28 21:36:35 29 4
gpt4 key购买 nike

我如何总结以下序列:

⌊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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com