小q的数列

解题思路:
- n&1(此时n被转换成01串)和n%2有同样效果都可以用来判断n是不是奇数,如果是奇数,n&1==1,n%2==1;是偶数,n&1==0,n%2==0.
- n>>1与n/2效果一样,n的01串右移后的值就等于除以2.
- 题目中f[i/2]+f[i%2]-->i是偶数时:f[i/2]; i是奇数时:f[i/2]+1(是奇数时+1)。
- 意思就是说:由几个奇数构成,最后答案就等于几。判断奇数又由n&1判断,除以二又由n>>1替代,所以有几个奇数构成-->01串中有几个1-->最后答案
- 所以最后一小问的答案就是全部都由一组成的01串。
- ((1ll<<f(n))-1)---》(1<<f(n))-1表示1左移f(n)位再减一(即获得f(n)位个1),1后的ll表示long long
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll n){
if(n<=1) return n;
if(n&1) return f(n>>1)+1;
return f(n>>1);
}
int main(){
int T;
cin>>T;
while(T--){
ll n;
cin>>n;
cout<<f(n)<<' '<<((1ll<<f(n))-1)<<endl;//((1ll<<f(n))-1)就是把数字转成01串的过程
}
return 0;
}