其实此题的难点不在于计算f(n)所代表的值 难点在于计算最早第几项出现的 而我们打表发现一下规律

alt 第几项与其二进制中1的数量有关系 具体数值为2^x-1而x也与f(n)的值相等 所以代码如下

#include <bits/stdc++.h>

using namespace std;

long long f(long long x)
{
    if(x==0)
    {
        return 0;
    }
    if(x==1)
    {
        return 1;
    }
    return f(x/2)+f(x%2);
}

void solve()
{
    long long n;
    cin>>n;
    long long ans=f(n);
     cout<<ans<<" ";
    cout<<(1LL<<ans)-1<<endl;
  //这个地方相当于ans^2-1
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}