#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<deque>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<stdlib.h>
#include<cassert>
using namespace std;
const long long mod=1000000007;
const long long inf=mod*mod;
const long long d2=500000004;
const double EPS=1e-10;
const double PI=acos(-1.0);
int ABS(int a){return max(a,-a);}
long long ABS(long long a){return max(a,-a);}
long long fib[100];
vector<pair<long long,long long > > v[100];
void dfs(int a,long long b,long long c,int d){
if(b&&c/b==1){
v[a].push_back(make_pair(b,c));
v[a].push_back(make_pair(c,b));
}
if(d==0){
long long tb=c;
long long tc=b+c*2;
if(tb<=fib[a+3]&&tc<=fib[a+3])dfs(a+1,tb,tc,1);
}
long long tb=c;
long long tc=b+c;
if(tb<=fib[a+3]&&tc<=fib[a+3])dfs(a+1,tb,tc,d);
}
int main(){
int a;scanf("%d",&a);
fib[1]=1;
fib[2]=2;
for(int i=3;i<100;i++){
fib[i]=min(inf,fib[i-2]+fib[i-1]);
}
dfs(0,1,1,0);
for(int i=1;i<=4;i++){
// for(int j=0;j<v[i].size();j++)printf("%d: %lld %lld\n",i,v[i][j].first,v[i][j].second);
}
while(a--){
long long x,y;scanf("%lld%lld",&x,&y);
if(x>y)swap(x,y);
int K=1;
for(int i=98;i>=1;i--){
if(fib[i]<=x&&fib[i+1]<=y){
K=i;
break;
}
}
printf("%d ",K);
if(K==1){
printf("%lld\n",(x%mod)*(y%mod)%mod);
continue;
}else{
long long ret=0;
for(int i=0;i<v[K].size();i++){
if(v[K][i].first>x||v[K][i].second>y)continue;
ret=(ret+(y-v[K][i].second)/v[K][i].first+1)%mod;
}
printf("%lld\n",ret);
}
}
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:38:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a;scanf("%d",&a);
^
./Main.cpp:49:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
long long x,y;scanf("%lld%lld",&x,&y);
^