// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 问题描述:给定起点s和终点t,每次可以移动+a或-a或+b或-b步,求到达终点的最少操作次数
// 输入格式:一行四个整数 s t a b,分别表示起点、终点、第一种步长、第二种步长
// 输出格式:一个整数,表示最少需要的操作次数
void (async function () {
// 读取输入并解构赋值为四个变量
// s: 起点位置
// t: 终点位置
// a: 第一种移动步长
// b: 第二种移动步长
let [s, t, a, b] = (await readline()).split(" ").map(Number);
// 特殊情况处理:如果起点到终点的距离能被b整除,说明只用b就能到达
// 此时不需要使用a,操作次数为0
if ((t - s) % b == 0) return console.log(0);
else {
// 计算起点到终点的距离
const diff = t - s;
// x表示使用第一种步长(a)的次数
let x = 0;
// 不断尝试使用不同次数的步长a,直到找到解
while (true) {
// 检查两种情况:
// 1. diff - a*x 能被b整除:表示用x次a向左走,剩余距离用b可以到达
// 2. diff + a*x 能被b整除:表示用x次a向右走,剩余距离用b可以到达
if ((diff - a * x) % b == 0 || (diff + a * x) % b == 0) {
// 找到解后输出使用a的次数
console.log(Math.abs(x));
return;
}
x++;
}
}
})();
// 示例说明:
// 输入:3 7 2 3
// 起点s=3,终点t=7,可以走2步或3步
// 过程:
// 1. 先检查 7-3=4 是否能被3整除,不能
// 2. 尝试使用一次步长2:
// - 向右走2步:6到7的距离1不能被3整除
// - 向左走2步:1到7的距离6能被3整除
// 3. 所以答案是1,表示使用一次步长2