这一道题原先是一个一个生成,一个一个加上去最后可怜的超时了。后来想到,可以先算出第i个位置为1,且有j个1可以用时有几种情况,然后判断每一个1的位置,就ok了!!
#include <iostream>
#include <cstdio>#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
int ss[35],n,l;
long long m,k=0,dp[35][35];
bool flag;
void aaa(int num,int wei);
void bbb(int sn,int sl,long long sm);
int main()
{
//freopen("kimbits.in","r",stdin);
//freopen("kimbits.out","w",stdout);
cin>>n>>l>>m;
if(m==1){
for(int i=1;i<=n;i++)
cout<<0;
cout<<endl;return 0;
}
for(int i=1;i<=n;i++)
{
dp[i][1]=1;
for(int o1=1;o1<i;o1++)
for(int j=1;j<l&&j<=o1;j++)
{
dp[i][j+1]+=dp[o1][j];
}
}
bbb(n,l,m-1);
for(int kk=n;kk>=1;kk--)
cout<<ss[kk];
cout<<endl;
return 0;
}
void bbb(int sn,int sl,long long sm)
{
long long k1=0;
for(int i=1;i<=sn;i++)
{
long long k2=0;
for(int j=1;j<=sl;j++)
k2+=dp[i][j];
if(k1+k2>=sm){
ss[i]=1;
if(k1+1==sm){return;}
bbb(i-1,sl-1,sm-k1-1);
return;
}
k1+=k2;
}
}