转化为模型即为求最多含有L个1的N位二进制数中的第M大的数
#include<stdio.h>
#include<iostream>
#include<memory.h>
using namespace std;
#define MAXN 63
long long a[MAXN];
long long b[MAXN];
long long c[MAXN][MAXN];
long long gcd(long long x,long long y)
{
if (y==0) return x;
else return gcd(y,x%y);
}
long long C(long long k,long long n)
{
long long i,j;
if (c[k][n]!=0) return c[k][n];
long long temp,ans;
for(i=n-k+1;i<=n;i++) a[i]=i;
for(i=1;i<=k;i++) b[i]=i;
for(i=1;i<=k;i++)
for(j=n-k+1;j<=n;j++)
{
temp=gcd(b[i],a[j]);
b[i]/=temp;
a[j]/=temp;
}
ans=1;
for(i=n-k+1;i<=n;i++)
ans=ans*a[i];
c[k][n]=ans;
return ans;
}
long long Calc(long long k,long long n)
{
long long ans;
long long i,j;
ans=0;
for(i=1;i<=k;i++)
ans+=C(i,n);
return ans;
}
long long ans;
void dfs(long long dep,long long k,long long rem)
{
if (dep==0) return ;
long long temp=Calc(k,dep-1);
if (temp>=rem) {dfs(dep-1,k,rem);return ;}
ans=ans|(1<<(dep-1));
dfs(dep-1,k-1,rem-temp-1);
}
int main()
{
long long n,l,m,i,j;
memset(c,0,sizeof(c));
while(cin>>n>>l>>m)
{
ans=0;
dfs(n,l,m-1);
cout<<ans<<endl;
}
}