小q的数列

alt

解题思路:

  1. n&1(此时n被转换成01串)和n%2有同样效果都可以用来判断n是不是奇数,如果是奇数,n&1==1,n%2==1;是偶数,n&1==0,n%2==0.
  2. 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;
}