#include <cstdio>
#include <vector>
#include <algorithm>
typedef long long i64;
const int N = 90, MOD = 1000000007;
i64 n, m, fib[N];
std::vector<std::pair<i64, i64>> pool[N];
int main() {
fib[0] = fib[1] = 1;
for (int i = 2; i < N; ++i) fib[i] = fib[i - 1] + fib[i - 2];
pool[1].emplace_back(1, 2);
pool[1].emplace_back(1, 3);
for (int i = 2; i + 2 < N; ++i)
for (auto it : pool[i - 1])
for (i64 y = it.first + it.second; y <= fib[i + 2]; y += it.second)
pool[i].emplace_back(it.second, y);
int q;
for (scanf("%d", &q); q--;) {
scanf("%lld%lld", &n, &m);
if (n > m) std::swap(n, m);
if (n == 1) {
printf("1 %d\n", m % MOD);
} else if (n == 2 && m == 2) {
puts("1 4");
} else {
int k = 1;
while (fib[k + 1] <= n && fib[k + 2] <= m) ++k;
int ans = 0;
for (auto it : pool[k - 1]) {
if (it.second <= n) ans = (ans + (m - it.first) / it.second) % MOD;
if (it.second <= m) ans = (ans + (n - it.first) / it.second) % MOD;
}
printf("%d %d\n", k, ans);
}
}
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:27:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘i64 {aka long long int}’ [-Wformat=]
printf("1 %d\n", m % MOD);
^
./Main.cpp:23:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for (scanf("%d", &q); q--;) {
^
./Main.cpp:24:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld%lld", &n, &m);
^