UOJ#551【UNR #4】校园闲逛 【多项式好题(雾)】

题目描述

Link

n n n 个点 m m m 条边的无向带权图, 1 ≤ 1\le 1 边权 ≤ V \le V V Q Q Q 次询问,从 x x x y y y 有多少条权值和为 w w w 的路径,路径可以经过重复边和重复点。

1 ≤ n ≤ 8 , 0 ≤ m ≤ 3 ∗ 1 0 5 , 1 ≤ V ≤ 65000 , 0 ≤ Q ≤ 10000 1\le n\le 8, 0\le m\le 3*10^5,1\le V\le65000,0\le Q\le 10000 1n8,0m3105,1V65000,0Q10000

题目分析

暴力 DP: d p [ i ] [ j ] [ v ] = ∑ k = 1 n d p [ i ] [ k ] [ v ′ ] ∗ n u m [ k ] [ j ] [ v − v ′ ] dp[i][j][v]=\sum\limits_{k=1}^n dp[i][k][v']*num[k][j][v-v'] dp[i][j][v]=k=1ndp[i][k][v]num[k][j][vv]

显然是个卷积形式。

  • 可以直接分治NTT,看做 F v = F v ′ ∗ W v − v ′ F_v=F_{v'}*W_{v-v'} Fv=FvWvv F F F 是个矩阵,比如 Code1 ,卡着时限过,复杂度 O ( n 3 V log ⁡ V + n 2 V log ⁡ 2 V ) O(n^3V\log V+n^2V\log^2V) O(n3VlogV+n2Vlog2V)

  • 可以用一些黑科技,因为分治时若 l ≠ 0 l\neq 0 l=0 2 l > r 2l>r 2l>r,所以 F   0 , r − l F_{~0,r-l} F 0,rl 都已经算好了,而此时 F   l , r F_{~l,r} F l,r 都是由 F   0 , l − 1 F_{~0,l-1} F 0,l1 贡献来的,所以用 F l , r ∗ F 0 , r − l F_{l,r}*F_{0,r-l} Fl,rF0,rl 当作新的 F l , r F_{l,r} Fl,r,这样不会算重也不会算漏。

    所以分治时当 l ≠ 0 l\neq 0 l=0 时就不用继续递归了,直接在这一层处理完。这样复杂度就变成了 T ( V ) = T ( V 2 ) + n 3 V + n 2 V log ⁡ V = O ( n 3 V + n 2 V log ⁡ V ) T(V)=T(\frac V2)+n^3V+n^2V\log V=O(n^3V+n^2V\log V) T(V)=T(2V)+n3V+n2VlogV=O(n3V+n2VlogV)
    比如 Code2

  • 可以用一些高科技
    g x , y g_{x,y} gx,y x → y x\to y xy 路径权值和对应方案数的生成函数, G G G g g g 对应的 n × n n\times n n×n 的矩阵, W W W 为边权多项式对应的矩阵,那么有 G = G W + I G=GW+I G=GW+I,于是 G = I I − W G=\frac I{I-W} G=IWI
    显然 W W W 矩阵里的每个多项式的常数项都不为 1,因此 I − W I-W IW 有逆,对这个元素为多项式的矩阵求逆,用类似高斯消元的初等变换法,需要 n n n 次多项式求逆, O ( n 2 ) O(n^2) O(n2) 次 DFT, n 3 n^3 n3 次点值乘法和多项式加法,复杂度 O ( n 3 V + n 2 V log ⁡ V ) O(n^3V+n^2V\log V) O(n3V+n2VlogV),略有一些(大)常数。

    或者转换一下思路,令 A ( z ) A(z) A(z) 表示权值为 i i i 的路径的矩阵生成函数,即多项式的每项系数都是一个矩阵, x i x^i xi 表示权值和为 i i i,矩阵内的元素表示方案数,并令 W W W 为对应的边权矩阵多项式,那么有 A = A W + I A=AW+I A=AW+I,于是 A = I I − W A=\frac I{I-W} A=IWI,但此时 W W W 是个多项式, I I I 相当于是这个多项式的常数项,要对多项式求逆,用牛顿迭代法,有 x 1 = x 0 ( 2 − A x 0 ) x_1=x_0(2-Ax_0) x1=x0(2Ax0)
    实现上有些需要注意的地方,虽然多项式系数为矩阵,但是DFT的时候因为只有数乘,所以可以对矩阵的每个元素分别 DFT。然后每个位置的点值现在是一个矩阵,做乘法的时候需要注意 A x 0 Ax_0 Ax0 的顺序不能变,因为矩阵不满足交换律。最开始的牛顿迭代的式子是 A x 0 − I = 0 Ax_0-I=0 Ax0I=0,那么平方之后是 A x 0 A x 0 − 2 A x 0 + I = 0 Ax_0Ax_0-2Ax_0+I=0 Ax0Ax02Ax0+I=0,即 A x 0 ( 2 − A x 0 ) = I Ax_0(2-Ax_0)=I Ax0(2Ax0)=I。因为左逆等于右逆,所以式子也可以写为 x 0 A − I = 0 x_0A-I=0 x0AI=0,推出 x 1 = ( 2 − x 0 A ) x 0 x_1=(2-x_0A)x_0 x1=(2x0A)x0,可以发现两个形式是一样的。
    复杂度同样是 O ( n 3 V + n 2 V log ⁡ V ) O(n^3V+n^2V\log V) O(n3V+n2VlogV)

    比如 Code3

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值