1+ #include < iostream>
2+ #include < queue>
3+ #include < cstring>
4+ using namespace std ;
5+ const int LIMIT = 120000 ;
6+ const int OFFSET = 120000 ;
7+
8+ // BFS to find the minimum steps to reach from A to B using operations +1, -1, and *N
9+ int minSteps (int A, int B, int N) {
10+ bool visited[LIMIT + OFFSET + 1 ] = {false };
11+ if (A == B) return 0 ;
12+
13+ queue<pair<int , int >> q; // (value, steps)
14+ q.push ({A, 0 });
15+ visited[A + OFFSET] = true ;
16+
17+ while (!q.empty ()) {
18+ auto [curr, steps] = q.front ();
19+ q.pop ();
20+
21+ if (curr == B) return steps;
22+
23+ if (curr < LIMIT && !visited[curr + 1 + OFFSET]) {
24+ visited[curr + OFFSET] = true ;
25+ q.push ({curr + 1 , steps + 1 });
26+ }
27+
28+ if (curr > -LIMIT && !visited[curr - 1 + OFFSET]) {
29+ visited[curr - 1 + OFFSET] = true ;
30+ q.push ({curr - 1 , steps + 1 });
31+ }
32+
33+ int mult = curr * N;
34+ if (mult >= -LIMIT && mult <= LIMIT && !visited[mult + OFFSET]) {
35+ visited[mult + OFFSET] = true ;
36+ q.push ({mult, steps + 1 });
37+ }
38+ }
39+
40+ return -1 ;
41+ }
42+
43+ int main () {
44+ ios::sync_with_stdio (false );
45+ int K;
46+ cin >> K;
47+
48+ int A, B, N;
49+ for (int i = 0 ; i < K; i++) {
50+ cin >> A >> B >> N;
51+ cout << minSteps (A, B, N) << endl;
52+ }
53+
54+ return 0 ;
55+ }
0 commit comments