这题目跟hdu2894差不多,只不过求出序列之后要求算出对应第k个长度为n的字段所代表的数字
#include<iostream> #include<string> using namespace std; int flag[(1<<15)+1],n,cnt,ans[(1<<15)+1],sum[(1<<15)+1]; void dfs(int u) { int t=((u<<1)&((1<<n)-1)); if(!flag[t]) { flag[t]=1; dfs(t); ans[cnt++]=0; } if(!flag[t+1]) { flag[t+1]=1; dfs(t+1); ans[cnt++]=1; } } int main() { int k; while(cin>>n>>k&&(n||k)) { memset(flag,0,sizeof(flag)); cnt=0; dfs(0); int l=0; for(int i=1;i<n;i++) { sum[l++]=0; } for(int i=cnt-1;i>=n-1;i--) { sum[l++]=ans[i]; } if(k==0) {cout<<0<<endl;continue;} int s=0; l=k; for(int i=n-1;i>=0;i--) { s+=sum[l++]<<i; if(l>=(1<<n)) break; } cout<<s<<endl; } return 0; }