累加和规律

1 2 3 4 5 总和为:56/2=15;
1 3 6 10 15 总和为:5
67/3!=35
1 4 10 20 35 总和为:5
678/4!=70
所以对于这样的序列的累加和有这样的规律:
1.k(k+1)/2
2.k
(k+1)(k+2)/3!
3.k
(k+1)(k+2)(k+3)/4!
4.……
例题:
CF1972E
题意:给了一个经过k次迭代后的树状数组,要求出最开始的数组是什么样的
先打表找找规律:
1 1 1 1 1 1 1 1
1 2 1 4 1 2 1 8
1 3 1 8 1 3 1 20
1 4 1 13 1 4 1 38
首先第i个位置的值是:a[i]+a[i-1]+a[i-2]+a[i-4]+……+a[i-lowbit(i)/2];
比如说第4个位置的值就是:a[4]+a[3]+a[2]=4,a[8]=a[8]+a[7]+a[6]+a[4]
然后我们单独计算第i个位置的贡献,比如说1:
第一轮循环:(第一个位置)
a[2]=a[2]+a[1],a[4]=a[2]+a[3],a[8]=a[7]+a[6]+a[4];
计算下来:a[2]加了一个a[1],a[4]加了一个a1,a[8]加了一个a1
所以:num[2]=1,num[4]=1,num[8]=1;
然后第二轮:
a[2]=a[2]+a[1],a[4]=a[2]+a[3],a[8]=a[7]+a[6]+a[4];
此时a[2]里面有两个a[1]了,num[2]=2,num[4]=num[2]+num[4]=3,num[8]=num[4]+num[8]=4;//不断累加
第三轮:
num[2]=3,num[4]=4+3=7,num[8]=7+4=11;
所以可以看出每轮的贡献
2:1 1 1 =3
4:1 2 3 =7
8:1 3 6 =10
好像正好是每轮的前缀和的不断迭代累加
所以第1个位置的贡献是随着后面的位数不断增加而增加的,并且是前缀和累积式的增加
第一个:k,第二个k(k+1)/2,第三个:k(k+1)(k+2)/3!,第四个:k(k+1)(k+2)(k+3)/4!;

代码

CF1972E

posted @ 2024-05-03 18:31  MENDAXZ  阅读(7)  评论(0编辑  收藏  举报