题意:开始一个数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;}
}