题目传送门:http://codeforces.com/gym/100623/attachments
题解:一个找规律的题,b[2]=a[2]要求a[1]=0,b[4]=a[4]要求a[2]+a[3]=0,b[6]=a[6]要求a[5]=0,b[8]=a[8]要求a[4]+a[6]+a[7]=0,到这里就可以看出来规律了,一个偶数可以对2^n取余为0,则要求他前面的n个数和为0,这个n个数的递减规律是1.1.2.4.8.16....2^n,这样,然后写一下就可以了
Code:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
freopen("fenwick.in","r",stdin);
freopen("fenwick.out","w",stdout);
int t,n,flag;
long long a[100005],sum;
long long n2[16]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
long long b[16]={1,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
while(cin>>n)
{
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=2;i<=n;i+=2)
{
sum=0;
flag=-1;
t=i;
for(int j=0;j<16;j++)
{
if(i%n2[j]==0)
flag=j;
else
break;
}
for(int j=0;j<flag;j++)
{
t-=b[j];
sum+=a[t];
}
t-=b[flag];
a[t]=-sum;
}
for(int i=1;i<=n;i++)
i==n?cout<<a[i]<<endl:cout<<a[i]<<" ";
}
return 0;
}