累加和规律
1 2 3 4 5 总和为:56/2=15;
1 3 6 10 15 总和为:567/3!=35
1 4 10 20 35 总和为:5678/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!;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库