c++ - 求所有整数 1 到 N 的最大奇数之和
问题描述
给我一个正整数 N。f(N) 是 N 的最大奇数除数。
求和 (f(1)+f(2)+f(3)+....f(N))%m。
如果 N 是 10 ^ 18 并且 m 可以达到 10 ^ 9,那么更快的算法应该是什么?
蛮力算法示例:
int sum=0;
int a[n+1];
for(int i=1;i<=n;i++){
if(i%2!=0)
a[i] = i;
else
a[i] = a[i/2];
}
for(int i=1;i<=n;i++){
sum+=a[i];
}
cout<<sum;
解决方案
[1,N] 范围内的奇数之和是奇数个数的平方,即 ((N+1)/2)^2,其中 '/' 表示整数除法。我们称其为 p(N)。
我们仍然需要找到 [1,N] 范围内偶数的最大奇数除数之和。我们可以用除以它们的 2 的最大幂来拆分范围内的偶数。
For 1 power of 2: p(N/2)
For 2 powers of 2: p(N/4)
For 3 powers of 2: p(N/8)
ETC...
即,f(N) = p(N) + p(N/2) + p(N/4) + p(N/8) + ...
以下是 N = 1、2、...、20 的结果:
N, f(N)
1, 1
2, 2
3, 5
4, 6
5, 11
6, 14
7, 21
8, 22
9, 31
10, 36
11, 47
12, 50
13, 63
14, 70
15, 85
16, 86
17, 103
18, 112
19, 131
20, 136
推荐阅读
- graph - NetworkX 与 GraphDB:它们有相似的用途吗?何时使用其中一种,何时一起使用?
- javascript - 在 Javascript 中展平对象数组的快速方法
- python - 数据框和数组之间的点积上的 TypeError
- haskell - 将带有两个参数的过滤器函数应用于由 Haskell 中带有一个参数的函数生成的列表
- javascript - 在一年的最后几天修复 Date.getWeek() 函数错误?
- c - 如何更改进程的进程组ID
- php - “购买”后尝试从网页中删除项目,但仍显示在用户购买项目历史记录中
- javascript - Javascript 承诺:监控数组的状态
- reactjs - React Hooks 结合 Firebase 数据未在页面加载时显示
- python - 如何使用 argparse 指定最小或最大浮点值