博客
关于我
lightoj1245——规律题
阅读量:650 次
发布时间:2019-03-15

本文共 1242 字,大约阅读时间需要 4 分钟。

调和级数的这一变形问题需要计算n除以1到n的所有整数的和:H(n) = n/1 + n/2 + n/3 + ... + n/n。对于大型n,直接计算会出现浮点精度问题,因此需要一种更有效且精确的方法。

计算方法

要高效解决这个问题,可以采用以下步骤:

  • 计算前sqrt(n)项和:直接逐一相加这些项,计算相对简单。
  • 计算后续项和:这些项中每一项的值都小于sqrt(n)。对于每个可能的值m,确定项的个数,然后乘以其项值求和。
  • 实现步骤

  • 计算sqrt(n):先求出n的平方根值m。
  • 处理前m项:问对每个i从1到m,累加n/i。
  • 处理m+1到n的项:找到每个可能的m值,计算对应的i范围,然后确定有多少个这样的i。
  • 调整重复计算的值:当n是完全平方数时,对于m的值会被计算两次,需要减去一次重复的计数。
  • 样例分析

    以n=10为例:

    • sqrt(10)=3
    • 前3项和为10 +5 +3=18
    • 后续m=1的项有i=4到10(共5项),贡献总和为1*5=5
    • m=2的项有i=3和10/5=2,但需检查范围
    • 最终总和为18+5+...=23

    代码实现

    #include 
    #include
    using namespace std;long long harmonic(long long n) { long long m = (long long)sqrt(n); long long ans = 0; // 前sqrt(n)项的和 for (long long i = 1; i <= m; ++i) { ans += n / i; // 处理后续项:m+1到m的范围 long long l = n / i; long long r = n / (i + 1); if (l > r) { ans += (l - r) * i; } } // 确定是否是完全平方数,进行调整 if (n / m == m) { ans -= m; } return ans;}int main() { int T; long long n; int case_num = 1; scanf("%d", &T); while (T--) { scanf("%lld", &n); long long ans = harmonic(n); printf("Case %d: %lld\n", ++case_num, ans); } return 0;}

    这段代码分为前sqrt(n)项和后续项的处理,通过减少计算次数,确保了在大n情况下的效率和精度。

    转载地址:http://wgymz.baihongyu.com/

    你可能感兴趣的文章
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>