AcCode:
#include<bits/stdc++.h>
#define M(a, b) make_pair(a, b)
using namespace std;
typedef long long LL;
typedef pair<long long , long long> pll;
LL m;
priority_queue<pll, vector<pll>, greater<pll> > q;
LL C(long long n, int k)
{
int i;
long long f = 1;
for(i = 1; i <= k; i++){
//一旦中间有哪一步超过了m那说明这个解就不存在了
if (f /i > m / (n-i+1)) //这样是对的
return m+1;
/*底下的都错了:
if(f > m)
if(f*(n-i+1)/i > m)
if (f * (n-i+1) > m * i)
return m+1;
*/
f *= (n-i+1);
f /= i;
}
return f;
}
void solve()
{
long long left, right, mid, t;
int k;
for(k = 1; C(2*k, k) <= m; k++){
/*
为什么二分最开始的边界是2*k 和 m
答: C(k, n)函数的定义域是2*k ~ m ,在这一定义域内图像是单调递减的。
注意自变量是n, 不是k !!!
*/
left = k*2, right = m;
while(left <= right){
mid = (left + right) >> 1;
t = C(mid, k);
if(t == m){
q.push(M(mid, k));
if(mid == k*2) break;
q.push(M(mid, mid-k));
break;
}
else if(t < m)
left = mid + 1;
else
right = mid - 1;
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%lld", &m);
solve();
int len = q.size();
if(len){
cout << len << endl;
for(int i = 0; i < len; i++){
printf("(%lld,%lld)%c", q.top().first, q.top().second, i == len-1 ? '\n' : ' ');
q.pop();
}
}
else
cout << "0" << endl;
}
return 0;
}