#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ul unsigned long long
using db = long double;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
void Code_By_Mohamed_Khaled() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
class Pollard {
public:
map<ul, int> cnt_primes;
vector<ul> primes, divisors;
ul modMul(ul a, ul b, const ul mod) {
ll ret = a * b - mod * (ul)((db)a * b / mod);
return ret + ((ret < 0) - (ret >= (ll)mod)) * mod;
}
ul modPow(ul a, ul b, const ul mod) {
if (b == 0) return 1;
ul res = modPow(a, b / 2, mod);
res = modMul(res, res, mod);
return b & 1 ? modMul(res, a, mod) : res;
}
bool rabin_miller(ul n) { // not ll!
if (n < 2 || n % 6 % 4 != 1) return n - 2 < 2;
ul A[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022},
s = __builtin_ctzll(n - 1), d = n >> s;
for (auto a : A) { // ^ count trailing zeroes
ul p = modPow(a, d, n), i = s;
while (p != 1 && p != n - 1 && a % n && i--) p = modMul(p, p, n);
if (p != n - 1 && i != s) return 0;
}
return 1;
}
ul pollard(ul n) { // return some nontrivial factor of n
auto f = [n, this](ul x) { return modMul(x, x, n) + 1; };
ul x = 0, y = 0, t = 30, prd = 2, i = 1, q;
while (t++ % 40 ||
__gcd(prd, n) == 1) { /// speedup: don't take gcd every it
if (x == y) x = ++i, y = f(x);
if ((q = modMul(prd, max(x, y) - min(x, y), n))) prd = q;
x = f(x), y = f(f(y));
}
return __gcd(prd, n);
}
void factor_rec(ul n, map<ul, int> &cnt) {
if (n == 1) return;
if (rabin_miller(n)) {
++cnt[n];
return;
}
ul u = pollard(n);
factor_rec(u, cnt), factor_rec(n / u, cnt);
}
void calcDivisorsRec(ul cur, int i) {
if (i >= primes.size()) {
divisors.push_back(cur);
return;
}
int r = cnt_primes[primes[i]];
for (int j = 0; j <= r; j++) {
calcDivisorsRec(cur, i + 1);
cur = cur * primes[i];
}
}
void calcDivisors(ul x) {
cnt_primes.clear();
primes.clear();
divisors.clear();
factor_rec(x, cnt_primes);
for (auto &u : cnt_primes) {
primes.push_back(u.first);
}
calcDivisorsRec(1, 0);
}
} pollard;
int main() {
Code_By_Mohamed_Khaled();
int t;cin>>t;
while(t--)
{
ll a,b;cin>>a>>b;
pollard.calcDivisors(a*b);
auto all=pollard.divisors;
int ans=0;
for(ll j=0;j<all.size();j++)
{
ll i=all[j];
ll y=a-i;
ll x=a*b/(a-y)-b;
if(x>0)ans++;
}
cout<<ans<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgIGxsIGxvbmcgbG9uZwojZGVmaW5lICB1bCB1bnNpZ25lZCBsb25nIGxvbmcKdXNpbmcgZGIgPSBsb25nIGRvdWJsZTsKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngsYXZ4MixmbWEiKQp2b2lkIENvZGVfQnlfTW9oYW1lZF9LaGFsZWQoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiNlbmRpZgp9CmNsYXNzIFBvbGxhcmQgewpwdWJsaWM6CiAgICBtYXA8dWwsIGludD4gY250X3ByaW1lczsKICAgIHZlY3Rvcjx1bD4gcHJpbWVzLCBkaXZpc29yczsKICAgIHVsIG1vZE11bCh1bCBhLCB1bCBiLCBjb25zdCB1bCBtb2QpIHsKICAgICAgICBsbCByZXQgPSBhICogYiAtIG1vZCAqICh1bCkoKGRiKWEgKiBiIC8gbW9kKTsKICAgICAgICByZXR1cm4gcmV0ICsgKChyZXQgPCAwKSAtIChyZXQgPj0gKGxsKW1vZCkpICogbW9kOwogICAgfQogICAgdWwgbW9kUG93KHVsIGEsIHVsIGIsIGNvbnN0IHVsIG1vZCkgewogICAgICAgIGlmIChiID09IDApIHJldHVybiAxOwogICAgICAgIHVsIHJlcyA9IG1vZFBvdyhhLCBiIC8gMiwgbW9kKTsKICAgICAgICByZXMgPSBtb2RNdWwocmVzLCByZXMsIG1vZCk7CiAgICAgICAgcmV0dXJuIGIgJiAxID8gbW9kTXVsKHJlcywgYSwgbW9kKSA6IHJlczsKICAgIH0KIAogICAgYm9vbCByYWJpbl9taWxsZXIodWwgbikgeyAgLy8gbm90IGxsIQogICAgICAgIGlmIChuIDwgMiB8fCBuICUgNiAlIDQgIT0gMSkgcmV0dXJuIG4gLSAyIDwgMjsKICAgICAgICB1bCBBW10gPSB7MiwgMzI1LCA5Mzc1LCAyODE3OCwgNDUwNzc1LCA5NzgwNTA0LCAxNzk1MjY1MDIyfSwKICAgICAgICAgICAgICAgIHMgPSBfX2J1aWx0aW5fY3R6bGwobiAtIDEpLCBkID0gbiA+PiBzOwogICAgICAgIGZvciAoYXV0byBhIDogQSkgeyAgLy8gXiBjb3VudCB0cmFpbGluZyB6ZXJvZXMKICAgICAgICAgICAgdWwgcCA9IG1vZFBvdyhhLCBkLCBuKSwgaSA9IHM7CiAgICAgICAgICAgIHdoaWxlIChwICE9IDEgJiYgcCAhPSBuIC0gMSAmJiBhICUgbiAmJiBpLS0pIHAgPSBtb2RNdWwocCwgcCwgbik7CiAgICAgICAgICAgIGlmIChwICE9IG4gLSAxICYmIGkgIT0gcykgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgdWwgcG9sbGFyZCh1bCBuKSB7ICAvLyByZXR1cm4gc29tZSBub250cml2aWFsIGZhY3RvciBvZiBuCiAgICAgICAgYXV0byBmID0gW24sIHRoaXNdKHVsIHgpIHsgcmV0dXJuIG1vZE11bCh4LCB4LCBuKSArIDE7IH07CiAgICAgICAgdWwgeCA9IDAsIHkgPSAwLCB0ID0gMzAsIHByZCA9IDIsIGkgPSAxLCBxOwogICAgICAgIHdoaWxlICh0KysgJSA0MCB8fAogICAgICAgICAgICAgICBfX2djZChwcmQsIG4pID09IDEpIHsgIC8vLyBzcGVlZHVwOiBkb24ndCB0YWtlIGdjZCBldmVyeSBpdAogICAgICAgICAgICBpZiAoeCA9PSB5KSB4ID0gKytpLCB5ID0gZih4KTsKICAgICAgICAgICAgaWYgKChxID0gbW9kTXVsKHByZCwgbWF4KHgsIHkpIC0gbWluKHgsIHkpLCBuKSkpIHByZCA9IHE7CiAgICAgICAgICAgIHggPSBmKHgpLCB5ID0gZihmKHkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fZ2NkKHByZCwgbik7CiAgICB9CiAgICB2b2lkIGZhY3Rvcl9yZWModWwgbiwgbWFwPHVsLCBpbnQ+ICZjbnQpIHsKICAgICAgICBpZiAobiA9PSAxKSByZXR1cm47CiAgICAgICAgaWYgKHJhYmluX21pbGxlcihuKSkgewogICAgICAgICAgICArK2NudFtuXTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB1bCB1ID0gcG9sbGFyZChuKTsKICAgICAgICBmYWN0b3JfcmVjKHUsIGNudCksIGZhY3Rvcl9yZWMobiAvIHUsIGNudCk7CiAgICB9CiAgICB2b2lkIGNhbGNEaXZpc29yc1JlYyh1bCBjdXIsIGludCBpKSB7CiAgICAgICAgaWYgKGkgPj0gcHJpbWVzLnNpemUoKSkgewogICAgICAgICAgICBkaXZpc29ycy5wdXNoX2JhY2soY3VyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgciA9IGNudF9wcmltZXNbcHJpbWVzW2ldXTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSByOyBqKyspIHsKICAgICAgICAgICAgY2FsY0Rpdmlzb3JzUmVjKGN1ciwgaSArIDEpOwogICAgICAgICAgICBjdXIgPSBjdXIgKiBwcmltZXNbaV07CiAgICAgICAgfQogICAgfQogICAgdm9pZCBjYWxjRGl2aXNvcnModWwgeCkgewogICAgICAgIGNudF9wcmltZXMuY2xlYXIoKTsKICAgICAgICBwcmltZXMuY2xlYXIoKTsKICAgICAgICBkaXZpc29ycy5jbGVhcigpOwogICAgICAgIGZhY3Rvcl9yZWMoeCwgY250X3ByaW1lcyk7CiAgICAgICAgZm9yIChhdXRvICZ1IDogY250X3ByaW1lcykgewogICAgICAgICAgICBwcmltZXMucHVzaF9iYWNrKHUuZmlyc3QpOwogICAgICAgIH0KICAgICAgICBjYWxjRGl2aXNvcnNSZWMoMSwgMCk7CiAgICB9Cn0gcG9sbGFyZDsKaW50IG1haW4oKSB7CglDb2RlX0J5X01vaGFtZWRfS2hhbGVkKCk7CglpbnQgdDtjaW4+PnQ7Cgl3aGlsZSh0LS0pCgl7CgkJbGwgYSxiO2Npbj4+YT4+YjsKCQlwb2xsYXJkLmNhbGNEaXZpc29ycyhhKmIpOwoJCWF1dG8gYWxsPXBvbGxhcmQuZGl2aXNvcnM7CgkJaW50IGFucz0wOwoJCWZvcihsbCBqPTA7ajxhbGwuc2l6ZSgpO2orKykKCQl7CgkJCWxsIGk9YWxsW2pdOwoJCQlsbCB5PWEtaTsKCQkJbGwgeD1hKmIvKGEteSktYjsKCQkJaWYoeD4wKWFucysrOwoJCX0KCQljb3V0PDxhbnM8PCJcbiI7Cgl9CglyZXR1cm4gMDsKfQ==