题目链接:​​https://vjudge.net/problem/Gym-100623F​​​
题意:给你一个数组a,然后根据a会求出一个数组b(题目的公式),现在让你改变一下数组a,使得求出来的数组b为数组a的前缀和,让你输出改造后的数组a
解析:观察一下可以知道,偶数项的b[i]总是加多了几项(含有2的因子个数),要想使得构造的数组a求出来的b为其前缀和,那么只能讲加多的那些在前一位的时候减去,这样构造出来的就是符合题意的

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
const int maxn = 1e6+100;
const int inf = 0x7fffffff;
long long a[maxn];
int main(void)
{
freopen("fenwick.in","r",stdin);
freopen("fenwick.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
long long t = 1,k = i;
long long sum = 0;
while(k%2==0)
{
k/=2;
sum += a[i-t];
t*=2;
}
a[i-1] -= sum;
}
for(int i=1;i<=n;i++)
{
if(i!=1)printf(" ");
printf("%I64d\n",a[i]);
}
puts("");
return 0;
}