类型:DP
题目:http://acm.timus.ru/problem.aspx?space=1&num=1081
思路:用f(i)表示位数为i的合法的数的个数,容易得到f(i) = f(i - 1) + f(i - 2)
对于k, 假如f(n - 1) >= k,则第1位为0,否则为1,为1时,更新k = k - f(n - 1),依次得到每一位数
// ural 1081. Binary Lexicographic Sequence
// wa ac 0.015s
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
const int MAXN = 50;
const int INF = 0x7f7f7f7f;
int cnt, n, k;
int dp[MAXN], endd[MAXN];
void solve() {
int i, j;
cin>>n>>k;
dp[1] = 2, dp[2] = 3;
FORE(i, 3, n)
dp[i] = dp[i - 1] + dp[i - 2];
if(k > dp[n]) {
cout<<"-1\n";
return ;
}
i = n - 1;
while(i >= 1) {
if(k <= dp[i])
endd[cnt++] = 0, --i;
else {
k -= dp[i];
endd[cnt++] = 1;
--i;
if(i < 1)
break;
endd[cnt++] = 0;
--i;
}
}
(k == 1) ? endd[cnt++] = 0 : endd[cnt++] = 1;
FOR(i, 0, cnt)
cout<<endd[i];
cout<<endl;
}
int main() {
solve();
return 0;
}