题意:开始一个数0,然后0变成1,后边的变换规则是如果当前是k就在后边加上k-1个0,然后再加上k-1,该问题求该序列的第n个数是多少。
思路:规律的题目。将串分成1,1,2,4,8,然后会发现s=1个s-2,2个s-3,3个s-4……然后n要用unsigned long long 。
code:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int dfs(ull n,int p){
int q=1;ull k;
for (int i=p-2;i>=0;i--){
if (i) k=1ll<<(i-1);
else k=1;
for (int j=0;j<q;j++){
if (k<n) n-=k;
else return dfs(n,i);
}
q++;
}
return p;
}
int sol(ull n){
if (n==1) return 0;n--;
for (int i=0;;i++){
ull t=1ll<<i;
if (t<n) n-=t;
else return dfs(n,i+1);
}
}
int main()
{
ull n;
while (cin>>n&&n){
cout<<sol(n)<<endl;
}
}