[AtCoder - abc465_d ]X to Y题解

你可以对数字做两种操作:

把数字除以

�
K取整
⌊
�
/
�
⌋
⌊x/K⌋。这会让数字变小,相当于在族谱里往上找父亲。
把数字变成
�
y,满足
⌊
�
/
�
⌋

�

⌊y/K⌋=x。这相当于

�

x 是

�

y 的父亲,也就是在族谱里往下找孩子。

目标:从

�

X走到

�

Y,最少要走几步?

核心思路

找"共同祖先"

算法细节

记录所有"父亲"

寻找"儿子"

举个栗子

假设
�

10

K=10,
�

123

X=123,
�

45

Y=45。

�

Y 的族谱(记录在

�

�

�

map里):

45

45(距离

0

4

4(距离

1

1,

45

45的父)

0

0(距离

2

2,

4

4的父)

�

X 去认亲:

第一轮:

�

X是

123

123。

�

Y的族谱里有

123

123吗?没有。

�

X找爸爸变成

12

12。

第二轮:

�

X是

12

12。

�

Y的族谱里有

12

12吗?没有。

�

X找爸爸变成

1

1。

第三轮:

�

X是

1

1。

�

Y的族谱里有

1

1吗?没有。

�

X找爸爸变成

0

0。

第四轮:

�

X是

0

0。

�

Y的族谱里有

0

0吗?有(距离

�

Y是

2

2步)。

计算:

�

X走了3步:

123

→

/

10

12

→

/

10

1

→

/

10

0

123

/10

​

12

/10

​

1

/10

​

0

�

Y走了2步
0
→
×
10
+
4
4
→
×
10
+
5
45
0
×10+4
​
4
×10+5
​
45
。
总步数:
3
+
2

5

3+2=5步。

代码实现

#include<bits/stdc++.h>

using namespace std;

#define int long long

signed main(){

int T;

cin>>T;

while(T--){

int x,y,k;

cin>>x>>y>>k;

map<int,int>m;

int c=y,d=0;

while(c>0)mc=d++,c/=k;

m0=d,c=x,d=0;

int ans=INT_MAX;

while(1){

if(m.count©)ans=min(ans,d+mc);

if(!c)break;

c/=k,d++;

}

cout<<ans<<"\n";

}

return 0;

}

相关推荐
C^h15 小时前
c++ string
开发语言·c++
raindayinrain15 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的16 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao16 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说17 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的17 小时前
C++第一节课
开发语言·c++
UIU11417 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场17 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi17 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
TMedical18 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗