#include<iostream>
#include<vector>
using namespace std;
#define sz(v) ((int)v.size())
#define rep(i,n) for(int i = 0; i < (int)(n); ++i)
#define repi(n) for(int i = 0; i < (int)(n); ++i)
#define repj(n) for(int j = 0; j < (int)(n); ++j)
#define fast_scan() (ios_base::sync_with_stdio(false),cin.tie(NULL))
typedef long long ll;
typedef vector<ll> vl;
ll gcd(ll x, ll y)
{
ll temp;
if (y > x) swap(x, y);
while (y != 0) temp = y, y = x % y, x = temp;
return x;
}
ll lcm(ll a, ll b)
{
return a / gcd(a, b) * b;
}
ll multi_lcm(vector<ll> &numbers, int i)
{
if (i <= 0) return numbers[i];
return lcm(numbers[i], multi_lcm(numbers, i - 1));
}
ll divisibles(ll n, ll m, vl &nums)
{
ll LCM = multi_lcm(nums, sz(nums) - 1);
return m / LCM - n / LCM + (n % LCM == 0 ? 1 : 0);
}
int main()
{
fast_scan();
int t;
cin >> t;
rep(T, t)
{
ll n, m, a, d;
cin >> n >> m >> a >> d;
vl nums;
repi(5) nums.push_back(a + i * d);
ll ans = 0;
int pw = 1 << 5;
repi(pw)
{
vl combination;
repj(5) if ((i >> j) & 1 == 1) combination.push_back(nums[j]);
if (sz(combination) != 0)
{
ll divisibles_num = divisibles(n, m, combination);
if (sz(combination) & 1) ans += divisibles_num; else ans -= divisibles_num;
}
}
cout << (m - n + 1) - ans << endl;
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBzeih2KSAoKGludCl2LnNpemUoKSkKI2RlZmluZSByZXAoaSxuKSBmb3IoaW50IGkgPSAwOyBpIDwgKGludCkobik7ICsraSkKI2RlZmluZSByZXBpKG4pICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCkobik7ICsraSkKI2RlZmluZSByZXBqKG4pICBmb3IoaW50IGogPSAwOyBqIDwgKGludCkobik7ICsraikKI2RlZmluZSBmYXN0X3NjYW4oKSAoaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksY2luLnRpZShOVUxMKSkKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bDsKbGwgZ2NkKGxsIHgsIGxsIHkpCnsKCWxsIHRlbXA7CglpZiAoeSA+IHgpIHN3YXAoeCwgeSk7Cgl3aGlsZSAoeSAhPSAwKSB0ZW1wID0geSwgeSA9IHggJSB5LCB4ID0gdGVtcDsKCXJldHVybiB4Owp9CmxsIGxjbShsbCBhLCBsbCBiKQp7CglyZXR1cm4gIGEgLyBnY2QoYSwgYikgKiBiOwp9CmxsIG11bHRpX2xjbSh2ZWN0b3I8bGw+ICZudW1iZXJzLCBpbnQgaSkKewoJaWYgKGkgPD0gMCkgcmV0dXJuIG51bWJlcnNbaV07CgoJcmV0dXJuIGxjbShudW1iZXJzW2ldLCBtdWx0aV9sY20obnVtYmVycywgaSAtIDEpKTsKfQpsbCBkaXZpc2libGVzKGxsIG4sIGxsIG0sIHZsICZudW1zKQp7CglsbCBMQ00gPSBtdWx0aV9sY20obnVtcywgc3oobnVtcykgLSAxKTsKCXJldHVybiBtIC8gTENNIC0gbiAvIExDTSArIChuICUgTENNID09IDAgPyAxIDogMCk7Cn0KaW50IG1haW4oKQp7CglmYXN0X3NjYW4oKTsKCWludCB0OwoJY2luID4+IHQ7CglyZXAoVCwgdCkKCXsKCQlsbCBuLCBtLCBhLCBkOwoJCWNpbiA+PiBuID4+IG0gPj4gYSA+PiBkOwoJCXZsIG51bXM7CgkJcmVwaSg1KSBudW1zLnB1c2hfYmFjayhhICsgaSAqIGQpOwoJCWxsIGFucyA9IDA7CgkJaW50IHB3ID0gMSA8PCA1OwoJCQoJCXJlcGkocHcpCgkJewoJCQl2bCBjb21iaW5hdGlvbjsKCQkJcmVwaig1KSBpZiAoKGkgPj4gaikgJiAxID09IDEpIGNvbWJpbmF0aW9uLnB1c2hfYmFjayhudW1zW2pdKTsKCQkJaWYgKHN6KGNvbWJpbmF0aW9uKSAhPSAwKQoJCQl7CgkJCQlsbCBkaXZpc2libGVzX251bSA9IGRpdmlzaWJsZXMobiwgbSwgY29tYmluYXRpb24pOwoJCQkJaWYgKHN6KGNvbWJpbmF0aW9uKSAmIDEpIGFucyArPSBkaXZpc2libGVzX251bTsgZWxzZSBhbnMgLT0gZGl2aXNpYmxlc19udW07CgkJCX0KCQl9CgkJY291dCA8PCAobSAtIG4gKyAxKSAtIGFucyA8PCBlbmRsOwoJfQoJcmV0dXJuIDA7Cn0=