#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<iostream>
#define LL long long
#define N 500
#define mmod 1000000007
using namespace std;
LL f[N],cnt[N],a[N][N][2],x,y,ans;
int n;
void solve1(LL x,LL y)
{
	for(int i=1;i<=x;i++)
	{
		ans=(ans+y/i)%mmod;
		if(y/i==0) break;
	}
	for(int i=1;i<=y;i++)
	{
		ans=(ans+x/i)%mmod;
		if(x/i==0) break;
	}
	ans=(ans-min(x,y))%mmod;
	ans=(ans+mmod)%mmod;
}
void solve(LL a,LL b,LL x,LL y)
{
	if(b>x || b+a>y) return;
	ans=(ans+(y-a)/b)%mmod;
}
int main()
{
	f[0]=f[1]=1;
	for(int i=2;;i++)
	{
		f[i]=f[i-1]+f[i-2];
		if(f[i]>1e18) {n=i;break;}
	}
	n-=2;
	cnt[1]=2;
	a[1][1][0]=1;a[1][1][1]=2;a[1][2][0]=1;a[1][2][1]=3;
	for(int i=1;i<n;i++)
		for(int j=1;j<=cnt[i];j++)
		{
			LL t=a[i][j][0]+a[i][j][1];
			while(t<=f[i+3])
			{
				a[i+1][++cnt[i+1]][0]=a[i][j][1];
				a[i+1][cnt[i+1]][1]=t;
				t+=a[i][j][1];
			}
		}
	int z;scanf("%d",&z);
	while(z--)
	{
		scanf("%lld%lld",&x,&y);
		if(x>y) swap(x,y);
		int k=1;
		for(int i=1;i<=n;i++) 
			if(f[i]<=x && f[i+1]<=y) k=i;
			else break;
		ans=0;
		printf("%d ",k);
		if(k==1) solve1(x,y);
		else for(int i=1;i<=cnt[k-1];i++) solve(a[k-1][i][0],a[k-1][i][1],x,y),solve(a[k-1][i][0],a[k-1][i][1],y,x);
		printf("%lld\n",ans);
	}
	return 0;
}