#include<stdio.h>
#include<stdlib.h>
#include<math.h>
long search(long m,int step)
{
    if(m==0||m==1)
    return m;
    if(m==2)
    return 1;
    long mmm=step;//得到了几次奇数
    long mm=m;//判断留存
    while(m!=0&&m!=1)
    {
        
        if(m/2%2==0)//除后得到奇数?不是直接除
        {
            m=m/2;
        }
        else//是的话step++
        {
            mmm++;
            m=m/2;
        }
    }
    if(mm%2==0)//偶数的话默认次数-1
    return mmm;
    else//奇数默认加一,因为没有判断m==1再拆解
    return mmm+1;
}
long fff(long m)//递归,很好理解
{
    if(m==0||m==1)
    return m;
    else if(m%2==0)
    {
        return fff(m/2);
    }
    else
    {
        return fff(m/2)+1;
    }
}
int main() {
    long a;
    int m;
    int step=0;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%ld",&a);
        step=0;
        printf("%ld %ld\n",fff(a),(long)pow(2,(search(a,step)))-1);
    }
    return 0;
}
//下面是解释
//我们先全部求解,发现偶数就是f[x/2],奇数就是f[(x-1)/2]+1;
//然后很自然的想到递归函数fff
//然后接下来就是找位置了
//全部列出来,然后找规律,我们发现只要下一项拆解到了奇数就会有加一的操作,所以我们联想和奇数的关系
//然后就发现只要拆解到奇数
//1:2*1-1 2*次数-1
//3:2*2-1
//5:2*2-1
//7:2*2*2-1
//然后结合f15,f31就发现了规律
//由于偶数默认传递过来的时候,我们最后都会拆到1,但是1又没有实际作用,所以return mmm
//奇数拆到1还要加1,所以我们return mmm+1
//是不是很奇妙呢,我也这样觉得,求佛啊求佛,开始暴力计算,结果段错误,不允许我用这么长的数据
//闪开!