Skip to content
ABC 465 D - X to Y

ABC 465 D - X to Y

2026/7/8

题目链接

题意简述

初始时有一个非负整数 x=Xx=X ,每次操作可将 xx 变为 yy ,其中 yy 满足 ⌊xK⌋=y\left \lfloor \dfrac{x}{K} \right \rfloor = y 或 ⌊yK⌋=x\left \lfloor \dfrac{y}{K} \right \rfloor = x.

求将 xx 变为 YY 的最少操作次数(可以不操作).

多测,1≤T≤2×1051\le T\le 2\times 10^5,0≤X,Y≤10180\le X,Y\le 10^{18},2≤K≤10182\le K\le 10^{18}.

解析

构造一棵以 00 为根节点的树,对于树上任意正整数节点 uu ,其父节点 Fa(u)=⌊uK⌋\mathrm{Fa}(u)=\left \lfloor \dfrac{u}{K} \right \rfloor.

则对 xx 进行一次操作相当于将节点 xx 移动到其相邻节点 yy ,最少操作次数即为节点 XX 和 YY 的最短路径 =Dist(X,LCA)+Dist(Y,LCA)=\mathrm{Dist}(X,\mathrm{LCA})+\mathrm{Dist}(Y,\mathrm{LCA}).

容易看出对于任意节点 u>vu>v ,Depth(u)≥Depth(v)\mathrm{Depth}(u)\ge\mathrm{Depth}(v) ,故只需要每次将数值较大的节点上移直至两点相遇(即到达 LCA\mathrm{LCA}),移动次数即为最短路径.

参考代码

cpp
1
2
3
4
5
6
int cnt = 0;
while (x != y) {
    if (x > y) x /= k;
    else y /= k;
    cnt++;
}