CF1731F Function Sum
对于一个长度为nnn的序列aaa。
定义lil_ili表示iii左边比aia_iai小的数的个数,即li=∑j=1i−1[aj 定义rir_iri表示iii右边比aia_iai大的数的个数,即ri=∑j=i+1n[aj>ai]r_i=\sum\limits_{j=i+1}^{n}[a_j>a_i]ri=j=i+1∑n[aj>ai] 我们称一个位置是好的,当且仅当li 对于序列aaa,定义函数f(a)=∑i=1nai[aiisgood]f(a)=\sum\limits_{i=1}^na_i[a_i \ is \ good]f(a)=i=1∑nai[ai is good]。 现在给定两个整数n,kn,kn,k,请你求出对于所有长度为nnn且1≤ai≤k1\leq a_i\leq k1≤ai≤k的数列aaa的f(a)f(a)f(a)的和是多少。 设fi,jf_{i,j}fi,j表示第iii个数为jjj时该位置对答案的贡献。枚举在iii之前小于aia_iai的数的个数xxx和在iii之后小于aia_iai的数的个数yyy,那么 fi,j=j×∑x=1i−1Ci−1x×(j−1)x(k−j+1)i−1−x∑y=x+1n−iCn−iy(k−j)yjn−i−yf_{i,j}=j\times \sum\limits_{x=1}^{i-1}C_{i-1}^x\times (j-1)^x(k-j+1)^{i-1-x}\sum\limits_{y=x+1}^{n-i}C_{n-i}^y(k-j)^yj^{n-i-y}fi,j=j×x=1∑i−1Ci−1x×(j−1)x(k−j+1)i−1−xy=x+1∑n−iCn−iy(k−j)yjn−i−y 那么答案就是∑i=1n∑j=1kfi,j\sum\limits_{i=1}^n\sum\limits_{j=1}^{k}f_{i,j}i=1∑nj=1∑kfi,j。 但这样的时间复杂度实在太大,所以我们考虑优化。 观察上面fi,jf_{i,j}fi,j的表达式,将其视作关于jjj的一个多项式,我们发现这个多项式的最高次数为nnn。 设Fj=∑i=1nfi,jF_j=\sum\limits_{i=1}^nf_{i,j}Fj=i=1∑nfi,j,Gi=∑j=1iFjG_i=\sum\limits_{j=1}^iF_jGi=j=1∑iFj。那么答案为GkG_{k}Gk。 因为fi,jf_{i,j}fi,j中jjj的最高次项的次数为nnn,所以GiG_iGi中iii的最高次项为n+1n+1n+1。我们可以用拉格朗日插值法求出n+2n+2n+2个GGG的值,就能求出G(k)G(k)G(k)的值了。 时间复杂度为O(n4logn)O(n^4\log n)O(n4logn)。
题解
code
#include