CodeFroces Gym 100860A AutoCoder

来源:互联网 发布:阿里云 系统镜像 上传 编辑:程序博客网 时间:2024/06/06 01:55

这题只需要找一找规律即可得出答案。

我们知道奇数位置肯定是一个等差数列求和。单独看偶数位置,会发现其中又蕴含了一个等差数列,把它求出来,再看剩下的,发现里面依然有一个等差数列。这样不断循环求出答案即可。

代码如下:

#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);#endiflong 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;}


原创粉丝点击