import java.util.*;
public class Main {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
input.nextLine();
for(int i=0;i<n;i++){
String[] s = input.nextLine().split(" ");
int A=Integer.parseInt(s[0]);
int B=Integer.parseInt(s[1]);
int p=Integer.parseInt(s[2]);
int q=Integer.parseInt(s[3]);
System.out.println(count(A,B,p,q,0));
}
}
private static int count(double A,double B,double p,double q,int num){
if(B-A<=p)
return num+1;
else if((B-A)/p<=q)
return num+2;
else {
return count(A,B,p*q*q,q,num+2);
}
}
}
var T = parseInt(readline());
while (T--) {
var arr = readline().split(" ")
var A = parseInt(arr[0]);
var B = parseInt(arr[1]);
var p = parseInt(arr[2]);
var q = parseInt(arr[3]);
print(test(A, B, p, q))
}
function test(A,B,p,q){
var index = 0;
while(A<B){
if(q==1){
A = A+p;
}else{
if(A+p<B){
p=p*q;
}else{
A=A+p;
}
}
index++;
}
return index;
} function test (a, b, p, q) {
returnMath.ceil(Math.log(((b - a) / p)) / Math.log(q)) + 1
}
let linenum = parseInt(readline())
for(let i = 0; i < linenum; i++){
let cur = readline().split(' ').map(Number)
print(test(cur[0], cur[1], cur[2], cur[3]))
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String temp=in.nextLine();
int num=Integer.parseInt(temp);
int stop=1;
while(stop<=num){
stop++;
temp=in.nextLine();
String [] temps=temp.split(" ");
long []nums=new long[temps.length];
for(int i=0;i<temps.length;i++) {
nums[i] = Long.parseLong(temps[i]);
}
long A=nums[0];
long B=nums[1];
long p=nums[2];
long q=nums[3];
int time=1;
while (A+p<B){
time++;
p=p*q;
}
System.out.println(time);
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
public class Program
{
public static void Main(string[] args)
{
int T = int.Parse(Console.ReadLine());
for(int k = 0; k < T; ++k)
{
string[] ipts = Console.ReadLine().Split(' ');
long A = long.Parse(ipts[0]);
long B = long.Parse(ipts[1]);
long p = long.Parse(ipts[2]);
long q = long.Parse(ipts[3]);
Console.WriteLine(GetTime(A, B, p, q));
}
}
public static long GetTime(long A, long B, long p, long q)
{
long time = 0;
while(A + p < B)
{
p *= q;
++time;
}
return time + 1;
}
} package test;
import java.util.Scanner;
/**
* @author Mr.Zhao
* @version 1.0
* @Description:
* @date 2020/1/5 10:48
*/
public class Test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
long[][] arrInt = new long[i][4];
scanner.nextLine();
for (int i1 = 0; i1 < i; i1++) {
String str = scanner.nextLine();
String[] arrString = str.split("\\s");
for (int i11 = 0; i11 < 4; i11++) {
arrInt[i1][i11] = Long.parseLong(arrString[i11]);
}
}
for (int j = 0; j < i; j++) {
int number = 0;
outterLoop:for (int k = 0; k < 4; k++) {
if (arrInt[j][0] >= arrInt[j][1]) {
System.out.println(number);
number = 0;
} else {
while (arrInt[j][0] <= arrInt[j][1]) {
long m = arrInt[j][0] + arrInt[j][2];
long n = arrInt[j][2] * arrInt[j][3];
if (m >= arrInt[j][1]) {
System.out.println(++number);
break outterLoop;
}else {
if ((2 * arrInt[j][2]) <= n) {
arrInt[j][2] = n;
number++;
} else {
arrInt[j][0] = m;
number++;
}
}
}
}
}
}
}
}
import math
nums = input('请输入A,B,p,q')
list2 = nums.split(' ') #以空格切割
list1 = list(map(int,list2)) #转为int类型
A = list1[0]
B = list1[1]
p = list1[2]
q = list1[3]
a = A - B
if a<=p:
b = 1
else:
if q <= 1:
b = math.ceil(a/p) #向上取整
else:
b = math.ceil(math.log(a/p,q))+1 #取以q为底a/p的对数
print('最少%d次操作使得B<=A'%b) #格式化输出
let n = parseInt(readline());
for (let i = 0; i < n; i++) {
let arr = readline().split(" ").map(Number);
let res = f(arr);
console.log(res);
}
function f(arr) {
// 只有当a + p >= b时,才值得让a = a + p
let a = arr[0];
let b = arr[1];
let p = arr[2];
let q = arr[3];
let count = 0;
while (a < b) {
if (a + p >= b) {
a = a + p;
} else {
p = p * q;
}
count++;
}
return count;
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int group = sc.nextInt();
for (int i = 0; i < group; i++) {
long[] arr = new long[4];
for (int j = 0; j < 4; j++) {
arr[j] = sc.nextLong();
}
long A = arr[0];
long B = arr[1];
long p = arr[2];
long q = arr[3];
int count = 1;
while (A + p < B) {
count++;
p = p * q;
}
System.out.println(count);
}
}
} def opCount(A, B, p, q): if A >= B: return 0 if A + p >= B: return 1 return 1 + opCount(A, B, p*q, q) T = int(input()) alist = [] for _ in range(T): temp = [int(i) for i in input().split()] alist.append(temp) for sub_list in alist: A, B, p, q = sub_list print(opCount(A, B, p, q))
let n=readline();
let input=[];
for(let i=0;i<n;i++){
input.push(readline().split(' ').map(item=>parseInt(item)));
}
let f=(a,b,p,q)=>{
let i=0;
let A=a;
let P=p;
while(A<b){
i++;
if(A+P>=b){
return i;
}else{
P*=q;
}
}
}
for(let i=0;i<n;i++){
console.log(f(...input[i]))
}
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int cnt;
sc.nextLine();
for(int i = 0; i < T; i++) {
long A = sc.nextInt();
long B = sc.nextInt();
long p = sc.nextInt();
long q = sc.nextInt();
cnt = 0;
while(A < B) {
if(A + p >= B) {
A = A + p;
}
else {
p = p * q;
}
cnt++;
}
System.out.println(cnt);
}
}
} const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
const input = []
rl.on('line', line => {
input.push(line)
const maxline = parseInt(input[0])
if (input.length === maxline + 1) {
handleInput(input)
rl.close()
}
})
function handleInput(input) {
const maxline = parseInt(input.shift())
for (let i = 0; i < maxline; i++) {
let arr = input[i].split(' ')
arr = arr.map(item => parseInt(item))
doubleSize(arr)
}
}
function doubleSize(arr) {
let [A, B, p, q] = arr
let count = 0
while (B > A) {
if (A + p >= B) {
A = A + p
} else {
p = p * q
}
count += 1
}
console.log(count);
}