1.设置两个标记add和mul;初值add=0,mul=1;
2.增加操作:tree[rt].sum[0]+=(r-l+1)*add
下面分析sum[1](二次方增加的原理):
由平方公式得:(a+b)^2=a^2+2*a*b+b^2;tree[rt].sum[1]+=add*add*(r-l+1)+2*add*tree[rt].sum[0];
再分析sum[2](三次方增加的原理):
(a+b)^3=a^3+3*a^2*b+3*a*b^2+b^3
因此:tree[rt].sum[2]+=3*add*tree[rt].sum[1]+3*add*add*tree[rt].sum[0]+(r-l+1)*add*add*add;
3.乘法操作:
tree[rt].sum[0]*=mul
tree[rt].sum[1]*=mul*mul
tree[rt].sum[2]*=mul*mul*mul
4.标记的更改:
(a*d+p)*d等价于d*=d;p*=d
5.对于(k*a+b);
一次方:k*a+b=k*a+(r-l+1)*b;
二次方:(k*a+b)^2=k*k*a*a+2*k*a*b+(r-l+1)b*b;
三次方:(k*a+b)^3=k*k*k*a*a*a+3*k*k*a*a*b+3*k*a*b*b+(r-l+1)b*b*b