计算方法:如何计算回文的阶梯型增长

今天做题时遇到了一个问题:
对于一个序列S1,S2,S3,S4,S5,...,Sn
如何计算以下的这些东西:
i=1 S1+S2+...+Sn
i=2 S1+2S2+...+2Sn-1+Sn
i=3 S1+2S2+3S3+...+3Sn-1+Sn
...
i=n-2 S1+2S2+3S3+...+3Sn-1+Sn
i=n-1 S1+2S2+...+2Sn-1+Sn
i=n S1+S2+...+Sn
很容易看出它们的规律,就是系数是回文的,并且阶梯增长的。
我就暂且先把它叫做回文的阶梯增长
那么如何来计算呢?
我们可以这样来思考:
对于每个i来说,所有系数本来都是i,然后每次从左到右第i位的系数都会固定下来,因此之后的回合都要减这位,以固定它的系数。因此我们每次都减去sum[i]+sum[n]-sum[n-i]
当i超过mid的时候,sum[i]与sum[n]-sum[n-i]的区间会有重合,重合的每次就被多减一次,正好与原来阶梯上升是个逆过程。
代码:

ll sum[N];

    ll ans = 0, sub = 0;
    for(int i = 1; i <= n; i++) {
        ans  += sum[n] * i - sub;
        sub += sum[i] + sum[n] - sum[n - i]; 
    }
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务