#include <algorithm>
#include <climits>
#include <cmath>
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int A, B, k;
cin >> A >> B >> k;
int min_step = INT_MAX;
queue<pair<int, int>> que;
if(A == B){ //直接相等
cout << 0 << endl;
continue;
}else if(k==1){ //k为1,无论怎么操作,A的值不会变,直接跳出
cout << -1 << endl;
continue;
}else{
que.push(pair<int, int> (A, 0)); //队列对每次进行t/k向上取整和t/k向下取整进行管理
while(!que.empty()){ // 直到t/k==0,或者出现两次t/k==1,停止循环
pair<int, int> t = que.front(); //first为t,second为除k的次数
// cout << t.first << endl;
que.pop();
if(t.first < B && B%k!=0){ // 枝剪法,当t小于B时,B如果不是k的倍数则不可能通过t*k得到B
break;
}
int bs=0;
bool b = true; // 标识符,判断是否存在整数bs,使得t * k^bs = B
if(B%t.first==0){ // B是否是t的倍数
int tt = B/t.first; //也可通过logk(B/t)是否是整数实现
while(tt%k==0){
bs++; //k的bs次方
tt/=k;
}
if(tt!=1){
b = false; // t不能通过乘以k^bs得到B
}
}
if(B%t.first==0 && b){
int step = t.second+bs; //除法的次数+乘法的次数
min_step = min(step, min_step);//最小次数
}else{
pair<int, int> t1(floor(1.0*t.first/k), t.second+1); // 向上取整
pair<int, int> t2(ceil(1.0*t.first/k), t.second+1); // 向下取整
if(t2.first && t2.first!=t.first){
// cout << t2.first << ',' << t.first<<endl;
que.push(t2);
}
if(t1.first && t1.first!=t.first){ // 避免1/n向上取整=1,产生循环
// cout << t1.first << ',' << t.first <<endl;
que.push(t1);
}
}
}
}
if(min_step==INT_MAX){
cout << -1 << endl;
}else{
cout << min_step << endl;
}
}
}
// 64 位输出请用 printf("%lld")