/*
一开始认为是个水题 直接模拟
没想到只得了50分 一看数据吓niao了
模拟妥妥的TLE
实在不好优化了0.0(最快O(m))
然后借鉴别人的 DP+神奇的输出
DP:状态:f[i][j] 前i个字符出现j次1的数字个数
很容易想到 如果i是1 f[i][j]=f[i][j]+f[i-1][j-1]
如果i是0 f[i][j]=f[i][j]+f[i-1][j]
初始化 i==0||j==0时 个数为1
然后就是神奇的输出了0.0
看代码吧
*/
/*
TLE 50
模拟
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,l,m,num;
int main()
{
cin>>n>>l>>m;
int s=(<<n-)-;
for(int i=;i<=s;i++)
{
int li=,x=i,y;
while(x>)
{
y=x%;
x=x/;
if(y==)li++;
}
if(li<=l)num++;
if(num==m)
{
int a[]={},li=;
while(i>)
{
a[++li]=i%;
i=i/;
}
for(int j=n;j>=;j--)
cout<<a[j];
return ;
}
}
}
/*
AC 100
DP
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll f[][],n,l,m;
int main()
{
ll i,j;
cin>>n>>l>>m;
for(i=;i<=n;i++)f[i][]=;
for(i=;i<=l;i++)f[][i]=;
for(i=;i<=n;i++)
for(j=;j<=l;j++)
f[i][j]=f[i-][j]+f[i-][j-];
m--;//减掉0的一种情况
for(i=n;i>=;i--)//枚举位置
if(m&&f[i-][l]<=m)//输出1的条件:前i-1位中含‘剩余’l的数字个数不超过m并且m>=1
{
cout<<;
m=m-f[i-][l];//与‘目标’还差几
l--;//‘剩余’l的数字个数
}
else cout<<;
return ;
}