日记
神秘稳定婚姻
神秘小 dp。
设 dpi,j 表示前 i 个数里凑出一个 gcd=j 的集合的方案数。转移是平凡的,注意预处理 gcd,不然时间复杂度就是 O(T⋅nVlogV),过不了。预处理就是 O(V2logV+T⋅nV)。
孩子们,我又来莫反了。
钦定 n≤m,直接开始推式子:
ans=i=1∑nj=1∑mlcm(i,j)gcd(i,j)=i=1∑nj=1∑m(gcd(i,j)ij)gcd(i,j)=g=1∑ni=1∑⌊gn⌋j=1∑⌊gm⌋(gig×jg)g[gcd(i,j)=1]=g=1∑ni=1∑⌊gn⌋j=1∑⌊gm⌋(gij)g[gcd(i,j)=1]=g=1∑nggi=1∑⌊gn⌋j=1∑⌊gm⌋(ij)gd∣gcd(i,j)∑μ(d)=g=1∑nggd=1∑⌊gn⌋μ(d)i=1∑⌊gdn⌋j=1∑⌊gdn⌋(id×jd)g=g=1∑nggd=1∑⌊gn⌋μ(d)i=1∑⌊gdn⌋j=1∑⌊gdn⌋(ij)g×d2g=g=1∑nggd=1∑⌊gn⌋μ(d)×d2gi=1∑⌊gdn⌋igj=1∑⌊gdm⌋jg我们发现这一坨:∑g=1ngg∑d=1⌊gn⌋μ(d)×d2g 的复杂度是一个调和级数,所以我们只用考虑如何 O(1) 求解 ∑i=1nig 就是了。由于枚举 g 单增,我们维护一个 vali 表示当前的 ig,因为 ⌊gdm⌋ 最多就是个 ⌊gm⌋,所以我们只用更新 i∈[1,⌊gm⌋] 并求前缀和就行了,也是调和级数,O(nlogn)。
看起来很简单,实则不然。
我们设 dpi 表示有 i 个点的情况,初始 dp0=1,转移就是枚举两颗子树的大小 x,y,剩下的 z=i−1−x−y。我们钦定 x≤y≤z。那么有转移:dpi←dpx×dpy×dpz。蛋柿,我们发现,如果有 x=y 或者别的相等,那么这玩意立马暴毙。
我门发现,当有两个数相等的时候,就例如 x=y,那么就相当于在 dpx 里取两个可重的不做区分的数的方案数。显然不能简单的 dpx2。这个的方案数是 (2dpx+2−1),具体的自己下来去推。
对于三个相等的,就相当于在 dpx 里取三个可重的不做区分的数。方案数就是 (3dpx+3−1)。那么我们转移就是:
dpi=⎩⎨⎧(3dpx+3−1)(2dpx+2−1)×dpz(2dpy+2−1)×dpxdpx×dpy×dpzx=zx=yy=zotherwise.这就很好做了。
我们发现,如果一个点不是绿色,那么它的子树一定都和它一个颜色。因为根是绿色,所以如果它的子孙要到根,就得经过它,它就只能是绿色或者和它的子孙一个色。
考虑在树的形态固定时怎么做。设 dpu 表示以这个点为根的方案数。那么显然有 dpu=∏v∈son(u)dpv+2。这个 dpv 表示 v 还是绿色的方案数,2 表示这个 v 是其他的色的方案数。
我们发现这个方案数一定是很多个数乘起来的,所以我们设 dpi 表示方案数恰好是 i 时最小的点数。那么我们枚举 i 因数 d,注意 d>2。那么就有 dpi=min(dpd−2×dpdi。时间复杂度 O(nn)。
我们把 ai 变成 m−ai,那么原式就变成了 max((bi−ai)modm)。我们发现,对于 bi<ai,答案是 bi+m−ai,那么答案就是把一些 bi+m,使得 bi≥ai,求 max((bi−ai)modm)。显然我们应该把 a,b 都按升序排序。我们发现加 m 的那些数一定是最小的几个,且加的数应该越小越优。直接二分出最小的加 m 的数的个数能够使得 ∀i∈[1,n],bi≥ai,求出答案就是了。
肚子疼。