其实此题的难点不在于计算f(n)所代表的值 难点在于计算最早第几项出现的 而我们打表发现一下规律
第几项与其二进制中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;
}



京公网安备 11010502036488号