题意
对于(d)层完全二叉树,(T)次查询,给定(a,b),求(a,b)路径编号和(x),以及树上有多少条路径编号和为(x)。(dle 50,Tle 10)
做法
令(cnt(x))为(x)二进制中(1)的个数
结论1:点(x)到根路径和为(2x-cnt(x))。在树根为(1)或(0)时均成立。
证明:
没想到什么简单的办法,暴力归纳一下即可
结论2:记路径和为(s),两端为(x,y),令(z=lca(x,y)),若(zlongrightarrow x)经过(a)条边,(zlongrightarrow y)经过(b)条边。若(s,a,b)为定值,(z)也为定值
证明:
若(s,a,b)为定值
记(z)的二进制有(t)位,则整条路径上的点前(t)位是确定的,显然整条路径前t位之和为((2^{a+1}+2^{b+1}-3)z)
记(k)为其他贡献:(k)的最小值为(x)一直往左走,(y)往右走一步后一直往左走;(k)的最大值为(x)往左走一步后一直往右走,(y)一直往右走。故(kin [2^b-1,2^a+2^{b+1}-a-b-3])
因为(k<2^{a+1}+2^{b+1}-3),所以(z)是定值,为(frac{s}{2^{a+1}+2^{b+1}-3})
令(k=s\%z),即除开前(t)位的贡献,令(x,y)除掉前(t)位后位(x',y'),根据结论1,(2(x'+y')-cnt(x')-cnt(y')=k)。显然得满足(x'<2^{a-1},y'<2^b)且(y')第(b)位为(1)
然后这题就只用先算出(s),枚举(a,b),转化问题为求有多少个(x',y')满足上面那个条件