链接bzoj2962
有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。
我好菜啊qwq
这题要求维护一个序列,我们可以用线段树来维护。其中有两种变换操作, 一种查询操作。
查询操作是查询区间内
c
个数的卷积,因为
对于取反操作:
我们发现,区间
对于区间增加值的操作:
就比较麻烦了…我们先试图对
i=3
的情况举例(打表找规律)
设要维护区间之中有3个数
a,b,c,d
,要增加的数为
x
,我们要更新
f[3]=(a+x)∗(b+x)∗(c+x)+(a+x)∗(b+x)∗(d+x)+(a+x)∗(c+x)∗(d+x)+(b+x)∗(c+x)∗(d+x)
=x3+[(a+b+c)+(a+c+d)+(b+c+d)+(b+c+d)]∗x2+[(ab+bc+ac)+(ac+ad+cd)+(ab+ad+bd)+(bd+bc+cd)]∗x+[(abc+acd+abd+bcd)]
=4x3+3(a+b+c+d)x2+2(ab+bc+ac+ad)x+(abc+abd+acd+bcd)
=4∗f[0]∗x3+3∗f[1]∗x2+2∗f[2]∗x+f[3]
观察得,对于每一个 xj 的系数 j∈[0,i] ,我们发现每次会产生 Cin 个 Cji 个数的乘积。而 Cji 个数的乘积中有 Cjn 个数可以组成一个 f[i−j] ,即
f[i]=∑j=0ixjCij∗CniCjn
化简得
f[i]=∑j=0ixjCi−jn−j