海蜇?海蜇!

题意

把题面搬这里

细节

  • 仅关键点范围在({0,...,d-1})
  • 本身值域是无限的
  • (a_ile 2.5 imes 10^5),这说明(20)维,(d=4)时,实际关键点高维是(0)...这里坑死了...

做法

下面讨论(d=4)的情况
若以原点出发,本质不同的关键点是不多的,记一个点为状态({d_0,d_1,d_2,d_3}),走(K)步的方案为(dp_{b_1,b_2,b_3})
在处理(dp)数组前,先预处理一些东西

  • (f_{i,j,k})为在(j)维空间中,从原点走(k)步到((i,i,...,i))的方案数

[f_{i,j,k}=sumlimits_{x}f_{i,j-1,k-x-(x+i)}{kchoose x+x+i}{x+x+ichoose x} ]

  • (h_{i,j})为只考虑(b_0,...,b_i)下,走(j)步到达该点的方案数

[h_{i,j}=sumlimits_{k}h_{i-1,j-k} imes f_{i,b_i,k} imes {jchoose k} ]

  • (g_i)为走恰好(i)步到达({b_0,b_1,b_2,b_3})

[g_i=h_{d,i}-sumlimits_{j}g_j imes f_{0,20,i-j} ]

(dp_{b_1,b_2,b_3}=sumlimits_{i}g_i imes 40^{K-i})
然后(O(N^2))算坐标差就好了

考虑优化算差过程
在手玩(d=2)时发现是异或,如果凭直觉(d=4)也是异或就全完了...
定义(oplus)为差运算,实际对于某一位来说,是算(|a_i-b_i|)
对数组定义(oplus)(a=foplus g):$$a_{x}=sumlimits_{i,j}[ioplus j=x]f_i imes g_j$$

(d)进制下,记(a_i)为数组(a)最高位为(i)的子数组,有
(egin{aligned}\ a_0&=f_0oplus g_0+f_1oplus g_2+f_3oplus g_3\ a_1&=f_0oplus g_1+f_1oplus g_0+f_1oplus g_2+f_2oplus g_1+f_2oplus g_3+f_3 oplus g_2\ a_2&=f_0oplus g_2+f_2oplus g_0+f_1oplus g_3+f_3oplus g_1\ a_3&=f_0oplus g_3+f_3oplus g_0\ end{aligned})

(x'=(f_0+f_1+f_2+f_3)oplus (g_0+g_1+g_2+g_3),~~y'=(f_0-f_1+f_2-f_3)oplus (g_0-g_1+g_2-g_3))
(x=a_0+a_2=(x'+y')/2,~~y=a_1+a_3=(x'-y')/2)

类似的,可以将(a_0,a_2)(a_1,a_3)分开
复杂度(T(n)=O(N)+6T(N/4)=N^{log_46})

原文地址:https://www.cnblogs.com/Grice/p/12381905.html