题目描述:
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)
输出描述:
输出一个整数,即为f(1) + f(2) + f(3).......f(N)
输入例子:
7
输出例子:
21
思路:f(2k) = f(k)
i 为偶数时f(2)+f(4)+......+f(i) = f(1)+f(2)+......+f(i/2);
设sum(i) = f(1) + f(2) + ... + f(i);
(1)若i为奇数则f(i)= i;所以sum(i) = sum(i-1)+i;
(2)若i为偶数
sum(i) = f(1)+f(2)+......+f(i) = [f(1)+f(3)+...+f(i-1)]+[f(2)+f(4)+......+f(i)]
= [1+2+......+i-1] + [f(1)+f(2)+.....+f(i/2)]
= [(1+i-1)*i/2]/2 + sum(i/2);
1 #include <iostream> 2 using namespace std; 3 //1 ≤ N ≤ 1000000000 4 //n定义为long long 5 int main() 6 { 7 long long n; 8 9 while(cin>>n) 10 { 11 long long sum = 0; 12 while(n>0) 13 { 14 if(n%2 == 0)//偶数 15 { 16 sum += n*n/4; 17 n/=2; 18 } 19 else//奇数 20 { 21 sum += n; 22 n--; 23 } 24 } 25 cout<<sum<<endl; 26 } 27 return 0; 28 }