这题目跟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;
}