题解 ABC 465 D - X to Y ABC 465 D - X to Y Copy Page Copy as Markdown View as Markdown 2026/7/8 题目链接 题意简述 初始时有一个非负整数 x=Xx=Xx=X ,每次操作可将 xxx 变为 yyy ,其中 yyy 满足 ⌊xK⌋=y\left \lfloor \dfrac{x}{K} \right \rfloor = y⌊Kx⌋=y 或 ⌊yK⌋=x\left \lfloor \dfrac{y}{K} \right \rfloor = x⌊Ky⌋=x. 求将 xxx 变为 YYY 的最少操作次数(可以不操作). 多测,1≤T≤2×1051\le T\le 2\times 10^51≤T≤2×105,0≤X,Y≤10180\le X,Y\le 10^{18}0≤X,Y≤1018,2≤K≤10182\le K\le 10^{18}2≤K≤1018. 解析 构造一棵以 000 为根节点的树,对于树上任意正整数节点 uuu ,其父节点 Fa(u)=⌊uK⌋\mathrm{Fa}(u)=\left \lfloor \dfrac{u}{K} \right \rfloorFa(u)=⌊Ku⌋. 则对 xxx 进行一次操作相当于将节点 xxx 移动到其相邻节点 yyy ,最少操作次数即为节点 XXX 和 YYY 的最短路径 =Dist(X,LCA)+Dist(Y,LCA)=\mathrm{Dist}(X,\mathrm{LCA})+\mathrm{Dist}(Y,\mathrm{LCA})=Dist(X,LCA)+Dist(Y,LCA). 容易看出对于任意节点 u>vu>vu>v ,Depth(u)≥Depth(v)\mathrm{Depth}(u)\ge\mathrm{Depth}(v)Depth(u)≥Depth(v) ,故只需要每次将数值较大的节点上移直至两点相遇(即到达 LCA\mathrm{LCA}LCA),移动次数即为最短路径. 参考代码 cpp 1 2 3 4 5 6 int cnt = 0; while (x != y) { if (x > y) x /= k; else y /= k; cnt++; } 洛谷 P17233 [Algo Beat Contest 017 B] 线性筛