这题只需要找一找规律即可得出答案。
我们知道奇数位置肯定是一个等差数列求和。单独看偶数位置,会发现其中又蕴含了一个等差数列,把它求出来,再看剩下的,发现里面依然有一个等差数列。这样不断循环求出答案即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
#include<stack>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
long long cal(long long tmp) {
return tmp + tmp * (tmp - 1) / 2;
}
int main() {
#ifndef ONLINE_JUDGE
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
long long n, sum = 0, tmp;
cin >> n;
n--;
if(n <= 0) {
sum = 0;
} else if(n % 2 == 0) {
n++;
tmp = n / 2 + 1;
sum += cal(tmp);
sum -= tmp;
// tmp = n / 2 + 1;
// sum += cal(tmp);
n--;
while(n >= 2) {
if(n % 4 == 0) {
tmp = n / 4;
sum += cal(tmp);
n -= 2;
n = (n - 2) / 2;
} else {
sum -= (n + 2) / 4;
n += 2;
}
}
} else if(n % 2 == 1) {
tmp = n / 2 + 1;
sum += cal(tmp);
n--;
while(n >= 2) {
if(n % 4 == 0) {
tmp = n / 4;
sum += cal(tmp);
n -= 2;
n = (n - 2) / 2;
} else {
sum -= (n + 2) / 4;
n += 2;
}
}
}
cout << sum << '\n';
return 0;
}