백준 13116번 이와 비슷한 문제가 존재하는데 여기서는 자식이 최대 2인 경우만 다루는 문제였다.
만약 K가 1인 경우에는 worst case로 시간 복잡도가 10의 15승으로 나오기 때문에 이 경우엔 그냥 두수의 차를 구하면 그게 거리가 된다.
계속해서 제출했는데 시간초과가 나서 이상해서 보니까 cin, cout을 사용할 경우 그런 경우가 난다고 해서 이 코드를 입력하고 제출하니 통과가 됐다.
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
int T;
int maxVal = -999;
long long N, K, Q;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N>>K>>Q;
map<pair<long long, long long>, int> s;
while (Q--)
{
long long a, b;
cin >> a >> b;
int Cnt = 0;
long long maxV = max(a, b);
long long minV = min(a, b);
if (K == 1)
{
cout << maxV - minV << '\n';
continue;
}
while (a != b)
{
if (a > b)
{
int orig = a;
a = a / K;
if (orig % K == 0 || K * a + 1 == orig)
{
a = a;
}
else
{
a = a + 1;
}
}
else
{
int orig = b;
b = b / K;
if (orig % K == 0 || K * b + 1 == orig)
{
b = b;
}
else
{
b = b + 1;
}
}
Cnt++;
}
cout << Cnt << '\n';
}
return 0;
}