#include <bits/stdc++.h>
using namespace std;
typedef bool boolean;

#define ll long long

const ll Lim = 1e18;
const int Mod = 1e9 + 7;

#define pll pair<ll, ll>

int Q;
ll x, y;
vector<pll> fib;
vector<vector<pll>> F;

boolean check(pll x) {
	return x.first <= Lim && x.second <= Lim;
}

void prepare() {
	F.push_back({pll(2, 1)}); // x > y
	F.push_back({pll(3, 2), pll(4, 3)});
	while (!F.back().empty()) {
		vector<pll> g;
		boolean first = true;
		vector<pll>& f = F.back();
		for (auto x : f) {
			if (first) {
				pll y = pll(x.second + x.first, x.first);
				if (check(y))
					g.push_back(y);
				y = pll(x.second * 2 + x.first, x.first + x.second);
				if (check(y))
					g.push_back(y);
			} else {
				pll y = pll(x.second + x.first, x.first);
				if (check(y))
					g.push_back(y);
			}
			first = false;
		}
		F.push_back(g);
	}
	fib.emplace_back(2, 1);
	ll a = 2, b = 1;
	while (true) {
		b += a;
		swap(a, b);
		if (a <= Lim && b <= Lim) {
			fib.emplace_back(a, b);
		} else {
			break;
		}
	}
}

int M;
int work(ll n, ll m) {
	ll ans = 0;
	for (auto x : F[M]) {
		if (x.first <= n && x.second <= m) {
			ans = (ans + (n - x.first) / x.second + 1) % Mod;
		}
	}
	return ans;
}

int main() {
	prepare();
	scanf("%d", &Q);
	while (Q--) {
		scanf("%lld%lld", &x, &y);
		if (x < y)
			swap(x, y);
		if (x == 1 && y == 1) {
			M = 0;
		} else {
			int l = 0, r = (signed) fib.size() - 1, mid;
			while (l <= r) {
				mid = (l + r) >> 1;
				if (x >= fib[mid].first && y >= fib[mid].second) {
					l = mid + 1;
				} else {
					r = mid - 1;
				}
			}
			M = l - 1;
		}
		int ans = work(x, y);
		ans += work(y, x);
		if (M == 0)
			ans += min(x, y);
		printf("%d %d\n", M + 1, ans % Mod);
	}
	return 0;
}
