#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll fib[100];
typedef pair<ll, ll>pii;
vector<pii>dat[100];
ll mod = 1000000007;
void calc(ll a, ll b, ll k)
{
if (b > 1000000000000000000LL)return;
if (a > fib[k + 2] || b > fib[k + 2])return;
dat[k].push_back(make_pair(a, b));
dat[k].push_back(make_pair(b, a));
calc(b, a + b, k + 1);
calc(a + b + b, a + b + b + b, k + 2);
}
int main()
{
/*for (int i = 1; i <= 34; i++)
{
for (int j = 1; j <= 34; j++)
{
int t = 1;
int x = i, y = j;
for (;;)
{
if (x < y)swap(x, y);
x %= y;
if (x == 0)break;
t++;
}
printf("%d ", t);
}
printf("\n");
}*/
fib[1] = 1;
for (int i = 2; i <= 90; i++)fib[i] = fib[i - 1] + fib[i - 2];
calc(1, 1, 1);
int query;
scanf("%d", &query);
for (int p = 0; p < query; p++)
{
ll za, zb;
scanf("%lld%lld", &za, &zb);
if (za > zb)swap(za, zb);
if (za == 1)
{
printf("1 %lld\n", zb % mod);
continue;
}
if (za == 2 && zb == 2)
{
printf("1 4\n");
continue;
}
int ans = 0;
for (int t = 0;; t++)
{
if (za >= fib[t] && zb >= fib[t + 1])ans = t;
else break;
}
ll cnt = 0;
for (int i = 0; i < dat[ans].size(); i++)
{
if (dat[ans][i].first <= za)cnt += max(0LL, (zb - dat[ans][i].second + dat[ans][i].first) / dat[ans][i].first);
cnt %= mod;
}
printf("%d %lld\n", ans - 1, cnt);
}
}