内存限制: 128 MiB时间限制: 100 ms标准输入输出题目类型: 传统评测方式: 文本比较
题目描述
定义函数f(x)表示x的最大奇约数,这里x表示正整数。例如,f(20) = 5,因为20的约数从小到大分别有:1, 2, 4, 5, 10, 20,其中最大的奇约数为5。
给出正整数N,求f(1)+f(2)+…+f(N)
输入格式
第1行:1个正整数N 1<=N<=10^9
输出格式
第1行:1个正整数,表示题目所求答案
样例
样例输入
复制7
样例输出
复制21
数据范围与提示
样例说明
f(1)+f(2)+f(3)+f(4)+f(5)+f(6)+f(7)=1+1+3+1+5+3+7=21
超时代码:
#include <bits/stdc++.h>
using namespace std;
long long n,ans;
int main(){cin>>n;for(int i=1;i<=n;i+=2){ans+=i;long long x=i;while(x*2<=n){x*=2;ans+=i;}}cout<<ans;
}
_____________________________________________________________________________
太难想了,感觉想出超时代码已经很不错了;
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
递归折半优化后:
#include <bits/stdc++.h>
using namespace std;
long long n,ans;
long long f(long long a){long long b=a-1;if(a==1)return 1;if(a%2==1){a--;b++;}return ans=f(a/2)+(1+b)*(b+1)/4;
}
int main(){cin>>n;f(n);cout<<ans;
}